根据布尔值选择第一行或最后一行
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)
下面的数据框按列 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)