假设我有一个数据框
df
,其中有 P 列,其中不同行可能会丢失数据,例如第一行数据可用于第 1 列但可用于第 2 列,对于其他行可能反之亦然。我想分别为每一列选择第一个和最后一个有效索引之间的列数据(同样,跨列可能不同),并检查是否剩下 NaN。然后,我想排除那些满足这种条件的列。
我的代码是这样工作的:
for i in df.columns:
df_i = df[i]
trimemd_i = df_i.loc[df_i.first_valid_index():df_i.last_valid_index()]
if np.any(trimmed_i.isnull()):
continue
else:
good_data.append(i)
df = df.loc[:, good_data]
问题是,如果我有很多列,循环就会很慢。有没有更有效的方法来做到这一点,也许可以避免循环?
用途:
data1 = {'A': [np.nan, 1, 2, 3, 4, 4, np.nan,np.nan],
'B': [np.nan, 2, 3, np.nan, 4, 4, 1, np.nan]}
df = pd.DataFrame(data1)
df1 = df.notna()
cols = df1.columns[(df1.cummax() & df1.iloc[::-1].cummax() & ~df1).any()]
print (cols)
Index(['B'], dtype='object')
df1 = df.notna()
out = df.loc[:, ~(df1.cummax() & df1.iloc[::-1].cummax() & ~df1).any()]
print (out)
A
0 NaN
1 1.0
2 2.0
3 3.0
4 4.0
5 4.0
6 NaN
7 NaN