在第一个和最后一个有效索引之间单独切片 pandas 列

问题描述 投票:0回答:1

假设我有一个数据框

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]

问题是,如果我有很多列,循环就会很慢。有没有更有效的方法来做到这一点,也许可以避免循环?

pandas dataframe slice missing-data
1个回答
0
投票

用途:

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
© www.soinside.com 2019 - 2024. All rights reserved.