根据布尔值选择第一行或最后一行

Choose first or last rows depending on boolean

下面的数据框按列 a 排序,脚本检查列 b 的前 30% 行是否为 NaN。如果是,and 其余行不都是 NaN,那么我们打印 True。如果我想检查最后一行是否是 NaN 而不是第一行,那么我设置 beginning_data=False。我想知道是否有更好的 pythonic 方法来完成这个,而不使用 if/else?

import pandas as pd

df = pd.DataFrame({'a' : [1,2,3,4,5,6,7,8,9,10], 'b' : [pd.NA,pd.NA,pd.NA,8,5,6,7,8,1,2]})
pct_rows = 0.3
nr_rows = int(df.shape[0] * pct_rows)
beginning_data = True
if beginning_data:
    pct_rows_null = df['b'].iloc[:nr_rows].isna().all()
    rest_rows = df['b'].iloc[nr_rows:].notna().all()
else:
    pct_rows_null = df['b'].iloc[-nr_rows:].isna().all()
    rest_rows = df['b'].iloc[:-nr_rows].notna().all()

print((pct_rows_null & rest_rows))

我想你可以在这里使用 np.where ->

pct_rows = 0.3
nr_rows = int(df.shape[0] * pct_rows)

beigining = np.where((df['b'].iloc[:nr_rows].isna().all()) & (df['b'].iloc[nr_rows:].notna().all()),True, False)
end  = np.where((df['b'].iloc[-nr_rows:].isna().all()) & (df['b'].iloc[:-nr_rows].notna().all()),True, False)

输出-

print(beigining,end) # True False

通过np.select -


pct_rows = 0.3
nr_rows = int(df.shape[0] * pct_rows)

condlist = [
    (df['b'].iloc[:nr_rows].isna().all()) & (df['b'].iloc[nr_rows:].notna().all()),
    (df['b'].iloc[-nr_rows:].isna().all()) & (df['b'].iloc[:-nr_rows].notna().all())
]
choiselist = [
    'True',
    'False'
]
np.select(condlist,choiselist)

我猜你想要这个(Return 如果两个条件都为真则为真否则为假)->

cond1 = (df['b'].iloc[:nr_rows].isna().all()) & (df['b'].iloc[nr_rows:].notna().all())
cond2 = (df['b'].iloc[-nr_rows:].isna().all()) & (df['b'].iloc[:-nr_rows].notna().all())
np.where((cond1 & cond2), True, False)