Python 当重复ID具有付款日期时,创建新列(dataframe)
我有一个数据框:Python 当重复ID具有付款日期时,创建新列(dataframe),python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据框: pd.DataFrame({'id': [1, 1, 2, 2, 3, 3], 'payment_count': 1, 2, 1, 2, 1, 2, 'payment_date': ['2/2/2020', '4/6/2020', '3/20/2020', '3/29/2020', '5/1/2020', '5/30/2020']}) 我想按每个“id”取max(“payment\u count”),并用关联的“payment\u date
pd.DataFrame({'id': [1, 1, 2, 2, 3, 3],
'payment_count': 1, 2, 1, 2, 1, 2,
'payment_date': ['2/2/2020', '4/6/2020', '3/20/2020', '3/29/2020', '5/1/2020', '5/30/2020']})
我想按每个“id”取max(“payment\u count”),并用关联的“payment\u date”创建一个新列。期望输出:
pd.DataFrame({'id': [1, 2, 3],
'payment_date_1': ['2/2/2020', '3/20/2020', '5/1/2020'],
'payment_date_2': ['4/6/2020', '3/29/2020', '5/30/2020']})
您可以尝试使用
pivot
,add\u prefix
,rename\u axis
和reset\u index
df.pivot(index='id',columns='payment_count',values='payment_date_')\
.rename_axis(None, axis = 1)\
.add_prefix('payment_date')\
.reset_index()
输出:
id payment_date_1 payment_date_2
0 1 2/2/2020 4/6/2020
1 2 3/20/2020 3/29/2020
2 3 5/1/2020 5/30/2020
使用groupby的另一种方法
df['paydate'] = df.groupby('id')['payment_date'].cumcount()+1
df['paydate'] = 'payment_date' + df['paydate'].astype(str)
df = df.set_index(['paydate','id'])['payment_date']
df = df.unstack(0).rename_axis(None)
很难看,但它符合你的要求<“代码>枢轴”听起来更好
groups = df.groupby('id')
args = {group[0]:group[1].payment_count.argsort() for group in groups}
records = []
for k,v in args.items():
payments = {f'payment_{i}':date
for i,date in enumerate(df.payment_date[v])}
payments['id'] = k
records.append(payments)
_df = pd.DataFrame(records)
你试过groupby吗?是的,但我想映射一下“payment_count'==2到新列。另外,我也没有试图聚合任何东西,所以不确定groupby在这里有什么帮助。它是旋转的。您可以尝试使用
df.pivot
并使用add_prefix
更改列名。阅读关于数据透视框架:太棒了,这实际上是我最好的选择,因为我的真实数据有50个“付款计数”,所以透视创建了50个我不需要的新列。