cumcout groupby如何按组列出

2024-04-18 03:11:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题与this question有关

import pandas as pd
df = pd.DataFrame(
    [['A', 'X', 3], ['A', 'X', 5], ['A', 'Y', 7], ['A', 'Y', 1],
     ['B', 'X', 3], ['B', 'X', 1], ['B', 'X', 3], ['B', 'Y', 1],
     ['C', 'X', 7], ['C', 'Y', 4], ['C', 'Y', 1], ['C', 'Y', 6]],
    columns=['c1', 'c2', 'v1'])
df['CNT'] = df.groupby(['c1', 'c2']).cumcount()+1

我有“CNT”栏。但我想把它按c2分组,分别得到X和Y的累积计数。你知道吗

    c1  c2  v1  CNT Xcnt Ycnt
0   A   X   3   1   1   0
1   A   X   5   2   2   0
2   A   Y   7   1   2   1
3   A   Y   1   2   2   2
4   B   X   3   1   1   0
5   B   X   1   2   2   0
6   B   X   3   3   3   0
7   B   Y   1   1   3   1
8   C   X   7   1   1   0
9   C   Y   4   1   1   1
10  C   Y   1   2   1   2
11  C   Y   6   3   1   3

有什么建议吗?我刚刚开始探索熊猫,感谢你的帮助。你知道吗


Tags: columnsimportdataframepandasdfasthispd
1条回答
网友
1楼 · 发布于 2024-04-18 03:11:26

我不知道如何直接执行此操作,但从计算的CNT列开始,可以按如下方式执行:

制作XcntYcnt列:

In [13]: df['Xcnt'] = df['CNT'][df['c2']=='X']

In [14]: df['Ycnt'] = df['CNT'][df['c2']=='Y']

In [15]: df
Out[15]:
   c1 c2  v1  CNT  Xcnt  Ycnt
0   A  X   3    1     1   NaN
1   A  X   5    2     2   NaN
2   A  Y   7    1   NaN     1
3   A  Y   1    2   NaN     2
4   B  X   3    1     1   NaN
5   B  X   1    2     2   NaN
6   B  X   3    3     3   NaN
7   B  Y   1    1   NaN     1
8   C  X   7    1     1   NaN
9   C  Y   4    1   NaN     1
10  C  Y   1    2   NaN     2
11  C  Y   6    3   NaN     3

接下来,我们要通过正向填充来填充每个c1组的NaN:

In [23]: df['Xcnt'] = df.groupby('c1')['Xcnt'].fillna(method='ffill')

In [24]: df['Ycnt'] = df.groupby('c1')['Ycnt'].fillna(method='ffill').fillna(0)

In [25]: df
Out[25]:
   c1 c2  v1  CNT  Xcnt  Ycnt
0   A  X   3    1     1     0
1   A  X   5    2     2     0
2   A  Y   7    1     2     1
3   A  Y   1    2     2     2
4   B  X   3    1     1     0
5   B  X   1    2     2     0
6   B  X   3    3     3     0
7   B  Y   1    1     3     1
8   C  X   7    1     1     0
9   C  Y   4    1     1     1
10  C  Y   1    2     1     2
11  C  Y   6    3     1     3

对于Ycnt,需要一个额外的fillna来填充将NaN转换为0,其中组以NaN开头(不能向前填充)。你知道吗

相关问题 更多 >