我会用
pandas.wide_to_long
对列名进行一些预处理和后处理:
out = (
pd.wide_to_long(df.set_axis(df.columns.str.replace(r'_?(\d+)_(week_year|deposit)',
r'_\2_\1', regex=True),
axis=1),
stubnames=['Day_date', 'Day_date_week_year', 'Day_deposit'],
i='PLAYER_ID', j='j',
sep='_')
.reset_index('PLAYER_ID')
.rename(columns={'Day_date': 'deposit_date',
'Day_date_week_year': 'deposit_week',
'Day_deposit': 'mean_deposit_amount',
})
.sort_values(by=['PLAYER_ID', 'deposit_date'])
.reset_index(drop=True)
)
输出:
PLAYER_ID deposit_date deposit_week mean_deposit_amount
0 1 2024-01-01 2024-W01 100
1 1 2024-01-02 2024-W01 150
2 2 2024-01-02 2024-W01 200
3 2 2024-01-03 2024-W01 250