【问题标题】:How to filter all the rows that contain ''isolated'' nan values in a column in python如何在python的列中过滤所有包含''isolated'' nan值的行
【发布时间】:2020-02-17 12:36:53
【问题描述】:

我在 pandas 数据框中有一列,其中一些行具有 NaN 值。

我想选择满足这些条件的行:
- 它们是 NaN 值;
- 它们被直接跟随或在非空值之前

例如,我想选择具有此 nan 值的行:
输入:

索引 |科尔

...
1 | 1344
2 |钠
3 | 532
...

期望的输出:
2 |南无

但我不想选择这些 nan 值(因为它们后面跟着一个 NaN 值或者紧跟在另一个 NaN 值之后):

索引 |科尔

...
1 | 1344
2 |钠
3 |钠
4 | 532

...

任何帮助将不胜感激

谢谢!

【问题讨论】:

  • 在您显示的数据框中没有连续的 NAN,您能否创建一个数据框,我们可以通过该数据框了解您想要什么并说出该数据框的预期输出是什么?
  • 我刚刚编辑了它!
  • 请检查我的解决方案,如果我的解决方案有效,请考虑接受:)

标签: python pandas filter nan


【解决方案1】:

下面我用一个例子来告诉你怎么做。一方面,Series.notna + Series.cumsum + Series.shift 用于通过groupby对连续的NaN值进行分组。使用transform,您会在那些拥有多个NaN的组中得到一个带有False的布尔系列。这个布尔系列的 AND 操作以及结果系列 df2['col2']. isna() 是我们正在寻找的系列来执行 Boolean indexing 并选择那些存在 NaN 但不连续的行

df=pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10],'col2':[np.nan,2,3,np.nan,np.nan,6,np.nan,8,9,np.nan]})
print(df)
   col1  col2
0     1   NaN
1     2   2.0
2     3   3.0
3     4   NaN
4     5   NaN
5     6   6.0
6     7   NaN
7     8   8.0
8     9   9.0
9    10   NaN

mask_repeat_NaN=df.groupby(df['col2'].notna().cumsum())['col2'].transform('size').le(2)
mask=mask_repeat_NaN&df['col2'].isna()
df_filtered=df[mask]
print(df_filtered)

   col1  col2
0     1   NaN
6     7   NaN
9    10   NaN

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 2020-11-23
  • 2019-11-18
  • 2015-07-02
  • 2017-09-17
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多