根据数据框中值的重复创建计数器

Creating a counter based on repetition of a value in dataframe

我有一个这样的数据框:

ID   day purchase
ID1  1   10  
ID1  2   15 
ID1  4   13
ID2  2   11
ID2  4   11
ID2  5   24
ID2  6   10 

期望的输出:

ID   day purchase Txn
ID1  1   10       1
ID1  2   15       2 
ID1  4   13       3 
ID2  2   11       1  
ID2  4   11       2
ID2  5   24       3 
ID2  6   10       4

所以对于每个 ID,我想创建一个计数器来跟踪他们的交易。在 SAS 中,我会做类似 First.ID 然后 Txn=1 else Txn+1

如何在 Python 中做这样的事情?

我想到了按 ID 和日期排序。但是如何创建自定义计数器?

这是一种解决方案。就像你建议的那样,它涉及按 ID 和日期排序(如果你的原始数据框不是),然后按 ID 分组,为每个 ID 创建一个计数器:

# Make sure your dataframe is sorted properly (first by ID, then by day)
df = df.sort_values(['ID', 'day'])

# group by ID
by_id = df.groupby('ID')

# Make a custom counter using the default index of dataframes (adding 1)
df['txn'] = by_id.apply(lambda x: x.reset_index()).index.get_level_values(1)+1

>>> df
    ID  day  purchase  txn
0  ID1    1        10    1
1  ID1    2        15    2
2  ID1    4        13    3
3  ID2    2        11    1
4  ID2    4        11    2
5  ID2    5        24    3
6  ID2    6        10    4

如果您的数据框开始时排序不正确,您可以像这样恢复到原始顺序:

df = df.sort_index()

我能想到的最简单的方法,但绝对不是最有效的方法。

df['txn'] = [0]*len(df)    
prev_ID = None    
for index, row in df.iterrows():
    if row['ID'] == prev_ID:
        df['txn'][index] = counter
        counter += 1
    else:
        prev_ID = row['ID']
        df['txn'][index] = 1
        counter = 2

产出

    ID  day  purchase  txn
0  ID1    1        10    1
1  ID1    2        15    2
2  ID1    4        13    3
3  ID2    2        11    1
4  ID2    4        11    2
5  ID2    5        24    3
6  ID2    6        10    4