我有一个Dataframe df,如下所示:
col1 col2 col3 col4
A A 2017-07-18 2
A A 2017-07-25 NaN
A A 2017-08-01 NaN
A A 2017-08-08 NaN
A B 2017-07-18 NaN
A B 2017-07-25 2.75
A B 2017-08-01 NaN
A B 2017-08-08 NaN
B B 2017-07-18 3.25
B B 2017-07-25 3.34
B B 2017-08-01 3.58
B B 2017-08-08 3.25
B D 2017-07-18 1.28
B D 2017-07-25 2.34
B D 2017-08-01 NaN
B D 2017-08-08 2.65
B D 2017-08-15 2.63
现在,我想创建一个新的数据帧df2,它将显示col1和col2以及一个新列,它将计算df.col4中连续NaN的最大数量。我想要的结果就是这样:
col1 col2 new_col
A A 3
A B 2
B B 0
B D 1
我试图做的是使用shift()和一些布尔掩码来获取我有多于或等于2个连续空值的行,但是我得到的结果数据帧远不及我正在尝试的那样实现。有什么想法吗?
答案 0 :(得分:0)
有点令人费解的方式,因为你无法NaN
进行shift
平等检查,我们会创建一个临时的isnull
In [827]: (df.assign(null=df.col4.isnull()).groupby(['col1', 'col2'])
.null
.apply(lambda x: (
x * (x.groupby((x != x.shift()).cumsum()).cumcount() + 1)).max())
.reset_index())
Out[827]:
col1 col2 null
0 A A 3
1 A B 2
2 B B 0
3 B D 1
有关如何找到连续组的信息,请参阅https://stackoverflow.com/a/27626699。
答案 1 :(得分:-1)
我会建议这个算法
1)制作字典:{(col1,col2):numberOfConsecutiveNANs}
2)逐行读取并计算连续的NAN
3)与字典中的数字进行比较,如果更大 - > ovvewrite数字