

Pandasのdataframeで、複数列の組み合わせ別に連番を付与する方法を教えていただきたいです。  
具体的には、「ID」「日付」「店」の組み合わせごとの連番を、「カウント」という列を作成してそこに入れたいです。

「ID」「日付」「店」があったとして、連番を格納する「カウント」の値は、以下のイメージです。

[code]

    df = pd.DataFrame({'ID': [1,1,2,2,2,3,3,3,3,4,4,4],
    '日': ['4/3', '4/5', '4/1', '4/1', '5/30', '5/5', '5/5', '5/5', '6/7', '5/3', '5/3', '6/7'],
    '店舗': ['A', 'B', 'A', 'A', 'C', 'A', 'B', 'B', 'B', 'C', 'D', 'A'],
    'カウント': ['1', '2', '1', '1', '2', '1', '2', '2', '3', '1', '2', '3']})
    
[/code]

ご存知の方いらっしゃいましたらアドバイスいただけるとありがたいです。


CC BY-SA 4.0
2019-11-30T11:45:50.307
60967
2021-11-25T05:05:25.520
2019-11-30T12:17:35.830
3060
36858
question
python pandas
Pandasでグループごとに連番を付与する方法


`DataFrame.groupby` メソッドで集約した後、`grouper.group_info` を使ってナンバリングします。

前提条件は、対象のデータフレームが ID でソート、同じ ID 内では「日」でソート、同じ ID, 「日」
では「店舗」でソート済みになっている事です(ID, 「日」, 「店舗」が同一の行は連続している)。そうでない場合は誤った結果が得られるでしょう。

[code]

    >>> ids = df.groupby(['ID']).grouper.group_info[0]
    >>> ids
    array([0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3])
    >>> comb = df.groupby(['ID', '日', '店舗']).grouper.group_info[0]
    >>> comb
    array([0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9])
    
    >>> count = []; nth = 0
    >>> for i, c in enumerate(comb):
          if i == 0 or ids[i] != ids[i-1]:
            nth = 1
          elif c != comb[i-1]:
            nth += 1
          count += [nth]
    
    >>> df['カウント'] = count
    >>> df
        ID     日 店舗  カウント
    0    1   4/3  A     1
    1    1   4/5  B     2
    2    2   4/1  A     1
    3    2   4/1  A     1
    4    2  5/30  C     2
    5    3   5/5  A     1
    6    3   5/5  B     2
    7    3   5/5  B     2
    8    3   6/7  B     3
    9    4   5/3  C     1
    10   4   5/3  D     2
    11   4   6/7  A     3
    
[/code]


CC BY-SA 4.0
2019-11-30T14:20:32.013
60976
2019-12-01T00:54:00.100
2019-12-01T00:54:00.100
60967
answer