我有一个Pandas 数据框,如下所示:

import pandas as pd
nan = float('nan')
data = {'col1': [1, nan, nan, nan, nan, 1, nan, nan], 
        'col2': [1, 1, nan, 1, 0, 0, 1, 0], 
        'col3': [nan, 0, nan, 1, 0, nan, nan, nan], 
        'col4': [1, 0, 0, 1, 0, 1, 1, 1]}
DF = pd.DataFrame(data)

DF

|col1|  |col2|  |col3|  |col4|
| 1  |  |  1 |  | NaN|  | 1  |
|NaN |  |  1 |  | 0  |  | 0  |
|NaN |  | NaN|  | NaN|  | 0  |
|NaN |  |  1 |  | 1  |  | 1  |
|NaN |  |  0 |  | 0  |  | 0  |
| 1  |  |  0 |  | NaN|  | 1  |
|NaN |  |  1 |  | NaN|  | 1  |
|NaN |  |  0 |  | NaN|  | 1  |

我想计算每一列的连续空值(NaN)的数量,如果连续空值超过两个,我想得到它的最大值.

For the above DF, I would get:

DF_nulls = ['col1': 4, 'col2': 0, 'col3': 3, 'col4': 0]

根据上述结果,应删除连续两个以上为空值的列.在这种情况下,最终数据帧应该只包含COL2和COL4. 我找到了类似的帖子,但没有一个解决了上面的问题. 我如何解决这个问题?先谢谢你.

推荐答案

Code

transform+max

出来 = (df
       .transform(lambda x: x.isna().groupby(x.notna().cumsum()).cumsum())
       .max()
       .mask(lambda x: x.eq(1), 0)
       .to_dict()
)

出来

{'col1': 4, 'col2': 0, 'col3': 3, 'col4': 0}

or use agg instead transform+max

出来 = (df
       .agg(lambda x: x.isna().groupby(x.notna().cumsum()).cumsum().max())
       .mask(lambda x: x.eq(1), 0)
       .to_dict()
)

相同结果

Python相关问答推荐

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

如何记录脚本输出

发生异常:TclMessage命令名称无效.!listbox"

如何获取TFIDF Transformer中的值?

为什么默认情况下所有Python类都是可调用的?

如果条件不满足,我如何获得掩码的第一个索引并获得None?

如何设置视频语言时上传到YouTube与Python API客户端

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如何启动下载并在不击中磁盘的情况下呈现响应?

Pandas GroupBy可以分成两个盒子吗?

Pandas Data Wrangling/Dataframe Assignment

在输入行运行时停止代码

Python—转换日期:价目表到新行

剪切间隔以添加特定日期

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

从旋转的DF查询非NaN值

Flask运行时无法在Python中打印到控制台

删除特定列后的所有列

在使用ROLING()获得最大值时,是否可以排除每个窗口中的前n个值?

如何通过函数的强式路径动态导入函数?