根据数据框中值的重复创建计数器
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
我有一个这样的数据框:
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