我有一个基本的df-贷款的月度报告,它是每个日期(每月)提供的1700个贷款合同ID例如报告于01.01.2019:
contract_id loan_sum expiry_days_01_01_2019
1 1000 20
2 2300 3
3 500 17
4 1400 6
5 890 5
另一个于01.02.2019
contract_id loan_sum expiry_days_01_02_2019
1 7000 20
2 3000 39
3 500 130
4 9400 89
5 909 7
等
我有5个具有相同ID号的报告。我将它们合并到另一个。
现在,我对到期日列具有许多nan值,例如在对角线正确填充了一个矩阵的矩阵中。
id contract_id loan_sum expiry_days_01_01_2019 expiry_01_02_2019
0 1 7000 20 nan
1 2 3000 39 nan
2 3 500 130 nan
3 4 9400 89 nan
4 5 909 7 nan
5 1 7000 nan 20
6 2 3000 nan 39
7 3 500 nan 130
8 4 9400 nan 89
9 5 909 nan 7
... ... ...
当合同编号重复时,应该拉相同的日期,但相反,它们变成NaN。
如何基于相同的,重复的合同ID来填充nan值?
您可以先使用groupby.transform
。如果总共将数据帧称为dfm
,则:
# I assumed you put the dataframes together like this
dfm = pd.concat([df1, df2], axis=0)
col_exp = dfm.filter(like='expiry').columns
dfm[col_exp] = dfm.groupby('contract_id')[col_exp].transform('first')
print (dfm)
contract_id loan_sum expiry_days_01_01_2019 expiry_days_01_02_2019
0 1 1000 20.0 20.0
1 2 2300 3.0 39.0
2 3 500 17.0 130.0
3 4 1400 6.0 89.0
4 5 890 5.0 7.0
0 1 7000 20.0 20.0
1 2 3000 3.0 39.0
2 3 500 17.0 130.0
3 4 9400 6.0 89.0
4 5 909 5.0 7.0
但是我认为改变整个数据框的构建方式可能是另一种解决方案并创建多索引列,例如:
list_dfs = [df1, df2]
dfm = pd.concat([df_.set_index('contract_id')
.rename(columns=lambda x: x.split('_')[0])
for df_ in list_dfs],
keys=[df_.filter(like='expiry').columns[0][-10:]
for df_ in list_dfs],
axis=1)
print (dfm)
01_01_2019 01_02_2019
loan expiry loan expiry
contract_id
1 1000 20 7000 20
2 2300 3 3000 39
3 500 17 500 130
4 1400 6 9400 89
5 890 5 909 7