python - 删除 pandas dataframe 中具有 N 个或多个连续 NaN 的所有行

标签 python pandas dataframe

这个问题的推论:replace values in pandas column when N number of NaNs exist in another column

         a         b         c     d           e
2018-05-25  0.000381  0.264318     land    2018-05-25
2018-05-26  0.000000  0.264447     land    2018-05-26
2018-05-27  0.000000  0.264791     NaN           NaT
2018-05-28  0.000000  0.265253     NaN           NaT
2018-05-29  0.000000  0.265720     NaN           NaT
2018-05-30  0.000000  0.266066     land    2018-05-30
2018-05-31  0.000000  0.266150     NaN           NaT
2018-06-01  0.000000  0.265816     NaN           NaT
2018-06-02  0.000000  0.264892     land    2018-06-02
2018-06-03  0.000000  0.263191     NaN           NaT
2018-06-04  0.000000  0.260508     land    2018-06-04
2018-06-05  0.000000  0.256619     NaN           NaT
2018-06-06  0.000000  0.251286     NaN           NaT
2018-06-07  0.000000  0.244250     NaN           NaT
2018-06-08  0.000000  0.235231     NaN           NaT
2018-06-09  0.000000  0.223932     land    2018-06-09

我想删除第 4 列 (d) 中包含 NaN 的所有行 3 次或更多次。输出应该是:

         a         b         c     d           e
2018-05-25  0.000381  0.264318     land    2018-05-25
2018-05-26  0.000000  0.264447     land    2018-05-26
2018-05-30  0.000000  0.266066     land    2018-05-30
2018-05-31  0.000000  0.266150     NaN           NaT
2018-06-01  0.000000  0.265816     NaN           NaT
2018-06-02  0.000000  0.264892     land    2018-06-02
2018-06-03  0.000000  0.263191     NaN           NaT
2018-06-04  0.000000  0.260508     land    2018-06-04
2018-06-09  0.000000  0.223932     land    2018-06-09

从那个问题,我试过这个:

    threshold = 3
    mask = df.d.notna()
    df.loc[(~mask).groupby(mask.cumsum()).transform('cumsum') < threshold, 'c'] = np.nan
    df = df[np.isfinite(df['c'])]

但是没用

最佳答案

通过连续值和 transform 创建助手 Series a size,最后按 boolean indexing 过滤:

mask = df.d.notna()
a = mask.ne(mask.shift()).cumsum()

df = df[(a.groupby(a).transform('size') < 3) | mask]
print (df)
             a         b         c     d           e
0   2018-05-25  0.000381  0.264318  land  2018-05-25
1   2018-05-26  0.000000  0.264447  land  2018-05-26
5   2018-05-30  0.000000  0.266066  land  2018-05-30
6   2018-05-31  0.000000  0.266150   NaN         NaT
7   2018-06-01  0.000000  0.265816   NaN         NaT
8   2018-06-02  0.000000  0.264892  land  2018-06-02
9   2018-06-03  0.000000  0.263191   NaN         NaT
10  2018-06-04  0.000000  0.260508  land  2018-06-04
15  2018-06-09  0.000000  0.223932  land  2018-06-09

详细信息:

print (a)
0     1
1     1
2     2
3     2
4     2
5     3
6     4
7     4
8     5
9     6
10    7
11    8
12    8
13    8
14    8
15    9
Name: d, dtype: int32

print (a.groupby(a).transform('size'))
0     2
1     2
2     3
3     3
4     3
5     1
6     2
7     2
8     1
9     1
10    1
11    4
12    4
13    4
14    4
15    1
Name: d, dtype: int64

关于python - 删除 pandas dataframe 中具有 N 个或多个连续 NaN 的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50809594/

相关文章:

python - 使用 CKAN API 和 Python Requests 库创建 CKAN 数据集

python - 从 pandas DataFrame 的列中查找、提取并重新附加年份

python - Pandas:使用 set_categories 时获取 SettingWithCopyWarning

python - pandas - 如果存在部分字符串匹配,则将值放入新列中

r - 在数据框变量中查找唯一字符串

python - 如何从 Python 的集合库中查看 deque 模块的源代码?

Java,如何启动几个使用 1 个 VM 的 jar?

Python-将数据框列格式化为不同的数据类型

dataframe - 初始化缺失值的列并稍后填充字段

如果另一列包含特定字符串,Python Pandas 如何更新列