熊猫:列举每个组中的项目

时间:2018-09-10 17:56:18

标签: python pandas pandas-groupby

我有一个类似

的DataFrame
    id   chi  prop   ord 
0   100   L    67     0 
1   100   L    68     1 
2   100   L    68     2 
3   100   L    68     3 
4   100   L    70     0 
5   100   L    71     0 
6   100   R    67     0 
7   100   R    68     1 
8   100   R    68     2 
9   100   R    68     3 
10  110   R    70     0 
11  110   R    71     0 
12  101   L    67     0 
13  101   L    68     0 
14  101   L    69     0 
15  101   L    71     0 
16  101   L    72     0 
17  201   R    67     0 
18  201   R    68     0 
19  201   R    69     0

ord本质上给出了当{propchiid)都具有相同值时的条目顺序。这不是我想要的。相反,我希望能够枚举{(id, chi)}中每个组g的项,从0到n_g,其中n_g是组g的大小。所以我想获得类似

的东西
    id   chi  prop   count 
0   100   L    67     0 
1   100   L    68     1 
2   100   L    68     2 
3   100   L    68     3 
4   100   L    70     4 
5   100   L    71     5 
6   100   R    67     0 
7   100   R    68     1 
8   100   R    68     2 
9   100   R    68     3 
10  110   R    70     0 
11  110   R    71     1 
12  101   L    67     0 
13  101   L    68     1 
14  101   L    69     2 
15  101   L    71     3 
16  101   L    72     4 
17  201   R    67     0 
18  201   R    68     1 
19  201   R    69     2

我想知道是否有一种简单的方法可以使用pandas来做到这一点。以下内容非常接近,但感觉太复杂了,由于某种原因,它不会让我join与原始数据框一起使用。

(df.groupby(['id', 'chi'])
   .apply(lambda g: np.arange(g.shape[0]))
   .apply(pd.Series, 1)
   .stack()
   .rename('counter')
   .reset_index()         
   .drop(columns=['level_2']))

编辑:第二种方法当然是for循环方法,但是我正在寻找比“ Pythonic”更复杂的东西:

for gname, idx in df.groupby(['id','chi']).groups.items():
    tmp = df.loc[idx]
    df.loc[idx, 'counter'] = np.arange(tmp.shape[0])

R有一个非常简单的方法来使用tidyverse包来实现这种行为,但是我还没有找到使用pandas来实现相同目标的有效方法。提供的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

connection.mockClear();

cumcount

df.assign(ord=df.groupby(['id', 'chi']).cumcount()) id chi prop ord 0 100 L 67 0 1 100 L 68 1 2 100 L 68 2 3 100 L 68 3 4 100 L 70 4 5 100 L 71 5 6 100 R 67 0 7 100 R 68 1 8 100 R 68 2 9 100 R 68 3 10 110 R 70 0 11 110 R 71 1 12 101 L 67 0 13 101 L 68 1 14 101 L 69 2 15 101 L 71 3 16 101 L 72 4 17 201 R 67 0 18 201 R 68 1 19 201 R 69 2 defaultdict

count