我们有原始银行数据,以便以后进行信用评分风险审计。其简化形式如下:
import pandas as pd
d = {'contract_id':['1175082589', '1175082589', '1175082589','1175082589','1575082194','1575082194','1575082194','1575082194'],
'date_of_contract_signature':['2019-05-01','2019-05-01','2019-05-01','2019-05-01','2019-06-01','2019-06-01','2019-06-01','2019-06-01'],
'date_of_report': ['2019-05-01', '2019-06-01', '2019-07-01','2019-08-01','2019-06-01', '2019-07-01', '2019-08-01','2019-09-01'],
'debt_90_plus':[0, 0, 34800,34800,0,0,56500,56500]}
df=pd.DataFrame(data=d)
print(df)
contract_id date_of_contract_signature date_of_report debt_90_plus
0 1175082589 2019-05-01 2019-05-01 0
1 1175082589 2019-05-01 2019-06-01 0
2 1175082589 2019-05-01 2019-07-01 34800
3 1175082589 2019-05-01 2019-08-01 34800
4 1575082194 2019-06-01 2019-06-01 0
5 1575082194 2019-06-01 2019-07-01 0
6 1575082194 2019-06-01 2019-08-01 56500
7 1575082194 2019-06-01 2019-09-01 56500
结果应该是每月变化的debt_90_plus:
d1={'date_of_contract_signature': ['2019-05-01', '2019-06-01'], 1:[0, 0],2:[0,0],3:[34800,56500],4:[34800,56500]}
df1=pd.DataFrame(data=d1)
print(df1)
date_of_contract_signature 1 2 3 4
0 2019-05-01 0 0 34800 34800
1 2019-06-01 0 0 56500 56500
I am try:
print(pd.pivot_table(df,index=['date_of_contract_signature','date_of_report']))
返回非常错误的结果:
debt_90_plus
date_of_contract_signature date_of_report
2019-05-01 2019-05-01 0
2019-06-01 0
2019-07-01 34800
2019-08-01 34800
2019-06-01 2019-06-01 0
2019-07-01 0
2019-08-01 56500
2019-09-01 56500
什么可以帮助解决这个问题?
示例
我认为在Q&A中不需要长列名。它只是在编写代码或创建输出时不方便。所以我把列名改成简单的
d = {'id':['1175082589', '1175082589', '1175082589','1175082589','1575082194','1575082194','1575082194','1575082194'],
'date_A':['2019-05-01','2019-05-01','2019-05-01','2019-05-01','2019-06-01','2019-06-01','2019-06-01','2019-06-01'],
'date_B': ['2019-05-01', '2019-06-01', '2019-07-01','2019-08-01','2019-06-01', '2019-07-01', '2019-08-01','2019-09-01'],
'debt':[0, 0, 34800,34800,0,0,56500,56500]}
df=pd.DataFrame(data=d)
df
id date_A date_B debt
0 1175082589 2019-05-01 2019-05-01 0
1 1175082589 2019-05-01 2019-06-01 0
2 1175082589 2019-05-01 2019-07-01 34800
3 1175082589 2019-05-01 2019-08-01 34800
4 1575082194 2019-06-01 2019-06-01 0
5 1575082194 2019-06-01 2019-07-01 0
6 1575082194 2019-06-01 2019-08-01 56500
7 1575082194 2019-06-01 2019-09-01 56500
制作同一日期的订单系列
s1 = df.groupby('date_A').cumcount().add(1)
s1
0 1
1 2
2 3
3 4
4 1
5 2
6 3
7 4
dtype: int64
make pivot_table withs1
out = df.pivot_table('debt', index='date_A', columns=s1).reset_index()
out
date_A 1 2 3 4
0 2019-05-01 0 0 34800 34800
1 2019-06-01 0 0 56500 56500
其他方式
如果你熟悉pandas,你也可以使用下面的一行代码
out = (df.groupby('date_A')['debt'].apply(lambda x: pd.Series(list(x)))
.unstack().rename(columns=lambda x: x + 1).reset_index())
相同的结果