cumcout groupby ---如何按组列出

时间:2014-05-23 17:00:25

标签: python pandas

我的问题与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

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

1 个答案:

答案 0 :(得分:1)

我没有直接知道直接执行此操作的方法,但从计算的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,需要一个额外的填充来填充转换NaN&#39s,其中该组以NaNs开头(无法向前填充)。