我有一个这样的数据框:
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和日排序的想法。但是如何创建定制的计数器?
答案 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