如何只删除不在 pandas Dataframe 列开头或结尾的带有 NaN 的行?

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

我有一个熊猫数据框。它有一个特定的列,该列可能包含也可能不包含一组连续的值,如 NaN 在其开始和结束时的值。此外,它可能也可能不包含间歇性的 NaN。

我的目标是只消除所有可能间歇性出现 NaN 的行。

例如,如果这是我的 df:-

df = pd.DataFrame({'A': [np.nan, np.nan, np.nan, np.nan, 45, 1, np.nan, 2, np.nan, 3, np.nan, 6, np.nan, np.nan, 8, 9, 15, np.nan, 18, np.nan, np.nan, np.nan, np.nan],
'B': [22,33,44,55,66,22,11,34,55,67,55,66,22,11,34,33,44,55,6,96,64,93,81]})

然后我需要输出为:-

df_new = pd.DataFrame({'A': [np.nan, np.nan, np.nan, np.nan, 45, 1, 2, 3, 6, 8, 9, 15, 18, np.nan, np.nan, np.nan, np.nan],
'B': [22,33,44,55,66,22,34,67,66,34,33,44,6,96,64,93,81]})

你能帮忙吗?

python pandas dataframe numpy nan
1个回答
1
投票

您可以为布尔索引使用多个条件,使用

ffill
/
bfill
传播非NA,以及
isna
/
notna

# is the A not NA?
m1 = df['A'].notna()
# is the A an external NA?
m2 = df['A'].ffill().isna()
m3 = df['A'].bfill().isna()

out = df.loc[m1|m2|m3]

使用

cummin
传播布尔值的替代方案:

m1 = df['A'].isna()
m2 = m1.cummin()
m3 = m1[::-1].cummin()

out = df.loc[(~m1)|m2|m3]

第三种方法使用

interpolate
只填充内部值,然后比较 NA 状态,如果它没有随着插值而改变,我们要么有一个非 NA,要么有一个外部 NA:

out = df.loc[df['A'].isna().eq(df['A'].interpolate(limit_area='inside').isna())]

输出:

       A   B
0    NaN  22
1    NaN  33
2    NaN  44
3    NaN  55
4   45.0  66
5    1.0  22
7    2.0  34
9    3.0  67
11   6.0  66
14   8.0  34
15   9.0  33
16  15.0  44
18  18.0   6
19   NaN  96
20   NaN  64
21   NaN  93
22   NaN  81

中间体(第一种方法):

       A   B     m1     m2     m3  m1|m2|m3
0    NaN  22  False   True  False      True
1    NaN  33  False   True  False      True
2    NaN  44  False   True  False      True
3    NaN  55  False   True  False      True
4   45.0  66   True  False  False      True
5    1.0  22   True  False  False      True
6    NaN  11  False  False  False     False
7    2.0  34   True  False  False      True
8    NaN  55  False  False  False     False
9    3.0  67   True  False  False      True
10   NaN  55  False  False  False     False
11   6.0  66   True  False  False      True
12   NaN  22  False  False  False     False
13   NaN  11  False  False  False     False
14   8.0  34   True  False  False      True
15   9.0  33   True  False  False      True
16  15.0  44   True  False  False      True
17   NaN  55  False  False  False     False
18  18.0   6   True  False  False      True
19   NaN  96  False  False   True      True
20   NaN  64  False  False   True      True
21   NaN  93  False  False   True      True
22   NaN  81  False  False   True      True
© www.soinside.com 2019 - 2024. All rights reserved.