我有一个DataFrame,其中一行是is_blank
,表示该行是否为NaN
。我想生成一个新特征,计算每组记录中当前行之前的NaN
行数,这些记录被分组并按id
分组。
下面是一个示例:
import pandas as pd
is_blank = [0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1]
id = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]
outval = [0, 0, 1, 2, 0, 1, 2, 0, 0, 0, 0]
test_df = pd.DataFrame({'id': id, 'is_blank': is_blank, 'outval': outval})
这是一个玩具数据集的样子。我想要生成
outval
列。outval[3]
为2,因为它之前有两个空行。然后outval[4]
重置为零,因为在那一行之前没有空行。In[2]: test_df
Out[2]:
id is_blank outval
0 1 0 0
1 1 1 0
2 1 1 1
3 1 0 2
4 1 1 0
5 1 1 1
6 1 1 2
7 2 0 0
8 2 0 0
9 2 0 0
10 2 1 0
目前我正在尝试一些类似于累积计数的形式,像这样:
In[3]: test_df.groupby(['id'])['is_blank'].cumsum().shift(1)
Out[3]:
0 NaN
1 0.0
2 1.0
3 2.0
4 2.0
5 3.0
6 4.0
7 5.0
8 0.0
9 0.0
10 0.0
但显然计数器不会在组内重置,最终会计算所有空行。我正在研究expanding_apply
选项,但无法完全理解其工作原理。
有没有关于如何高效解决这个问题的想法?
id
。is_blank = [0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]
;outval= [0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1]
;然而,期望的输出是:outval=[0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]
似乎在1后面有多个0的情况下会失败。 - sriramntest_df['outval'] = (test_df.groupby([test_df.id, (test_df.is_blank.diff() != 0).cumsum()]).is_blank.cumsum().groupby(test_df.id).shift().fillna(0))
。 - Psidom