根据数据框

时间:2018-03-08 13:49:17

标签: python counter repeat

我有一个这样的数据框:

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,否则Txn + 1

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

我有了按ID和日排序的想法。但是如何创建定制的计数器?

2 个答案:

答案 0 :(得分:2)

这是一个解决方案。像你建议的那样,它涉及按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()

答案 1 :(得分:0)

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

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