如何根据重复ID填写NaN?

问题描述 投票:0回答:1

我有一个基本的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值?

pandas dataframe series fillna
1个回答
1
投票

您可以先使用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

© www.soinside.com 2019 - 2024. All rights reserved.