19

パンダでは、特定のグループ化に基づいて行を列挙する新しい列を追加するにはどうすればよいですか?

たとえば、次の DataFrame があるとします。

import pandas as pd
import numpy as np

a_list = ['A', 'B', 'C', 'A', 'A', 'C', 'B', 'B', 'A', 'C']
df = pd.DataFrame({'col_a': a_list, 'col_b': range(10)})
df
  col_a  col_b
0     A      0
1     B      1
2     C      2
3     A      3
4     A      4
5     C      5
6     B      6
7     B      7
8     A      8
9     C      9

のグループ化と並べ替えにcol_c基づいて、「グループ」の N 番目の行を与えるa を追加したいと思います。col_acol_b

望ましい出力:

  col_a  col_b  col_c
0     A      0      1
3     A      3      2
4     A      4      3
8     A      8      4
1     B      1      1
6     B      6      2
7     B      7      3
2     C      2      1
5     C      5      2
9     C      9      3

にたどり着くのに苦労していますcol_c。で適切なグループ化と並べ替えを行うことができます.sort_index(by=['col_a', 'col_b'])。新しい列に移動して各行にラベルを付けるだけです。

4

3 に答える 3

34

まさにこの場合のために、cumcountがあります。

df['col_c'] = g.cumcount()

ドキュメントで言うように:

各グループの各項目に、0 からそのグループの長さ - 1 までの番号を付けます。


元の回答 (cumcount が定義される前)。

これを行うヘルパー関数を作成できます。

def add_col_c(x):
    x['col_c'] = np.arange(len(x))
    return x

最初に列 col_a で並べ替えます。

In [11]: df.sort('col_a', inplace=True)

次に、この関数を各グループに適用します。

In [12]: g = df.groupby('col_a', as_index=False)

In [13]: g.apply(add_col_c)
Out[13]:
  col_a  col_b  col_c
3     A      3      0
8     A      8      1
0     A      0      2
4     A      4      3
6     B      6      0
1     B      1      1
7     B      7      2
9     C      9      0
2     C      2      1
5     C      5      2

を取得するには、1,2,...を使用できますnp.arange(1, len(x) + 1)

于 2013-06-21T08:55:16.373 に答える