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个我不需要的新列。