逐行对 Pandas 中的数据组求和

Summing group of data in Pandas row by row

提问人:Giovanni Chiarion 提问时间:10/31/2023 最后编辑:Giovanni Chiarion 更新时间:10/31/2023 访问量:104

问:

在使用 Pandas 对一组数据进行每行求和时,我遇到了很多麻烦。 我试着解释得更好。

我有一个数据帧(见下文),我想在其中计算每个块中存在的event_code列中“闪烁”的事件数(event_block从 0 到 5)。 假设每个块的行数相同。

谢谢你的帮助!

               event_block     event_code
    0                 0         blink
    1                 0         blink
    2                 0         -1
    3                 0         -1
    4                 0         -1
    5                 1         -1
    6                 1         blink
    7                 1         -1
    8                 1         blink
    9                 1         -1  

我尝试了多种方法来获得一个优雅的解决方案,但没有成功。 我的想法是为 blink 事件生成一个 0 和 1 的二进制向量,并为每个事件块生成 than sum,但我总是在每个块的每一行中得到相同的求和数字......

result_df['is_blink'] = (result_df['event_code'] == 'blink').astype(int)

根据需要输出:

blink_count     
1         
2         
0         
1         
0    
Python 熊猫 数据科学 科学

评论

0赞 Panda Kim 10/31/2023
你能提供最小的例子和期望的输出吗?stackoverflow.com/help/minimal-reproducible-example
0赞 Giovanni Chiarion 10/31/2023
感谢您的建议,我修改了我的问题,提供了一个最小的示例和所需的输出

答:

0赞 mozway 10/31/2023 #1

首先使用 groupby.cumcount 生成一个计数器,然后使用 groupby.sum

out = (df['event_code']
 .eq('blink')
 .groupby(df.groupby('event_block').cumcount())
 .sum()
)

输出:

0    1
1    2
2    0
3    1
4    0
Name: event_code, dtype: int64

如果还需要 的计数,请使用交叉表-1

out = pd.crosstab(df.groupby('event_block').cumcount(), df['event_code'])

输出:

event_code  -1  blink
row_0                
0            1      1
1            0      2
2            2      0
3            1      1
4            2      0

评论

0赞 Giovanni Chiarion 10/31/2023
非常感谢您的回答!它有效!但是,我可以问您,如果我有另一个名为“条件”的分类列,并且我必须计算每个条件中每个event_block中的眨眼事件,我该如何处理同样的问题?我应该在哪里添加这个新的分组因子?我很困惑......
0赞 Gabriel Santello 10/31/2023 #2

使用 groupby.ffill,然后使用 groupby.sum

m = result_df["event_code"].eq("blink").groupby(result_df["event_block"]).transform("ffill")
result_df["is_blink"] = np.where(m, 1, 0)

summary = result_df.groupby('event_block')[['is_blink']].sum()

输出示例:

event_block is_blink
1           2
2           2
3           0