通过匹配另一个数据框的多级标题来填充数据框的列

时间:2018-12-11 17:50:29

标签: python python-3.x pandas match

我有多级数据框架1:

Cstep                      step 0    step 1    step 2    step 3    step 4
D1      E1      S1       0.372621  0.211435  0.162299  0.149502  0.104143
                S2       0.104714  0.106229  0.119725  0.172926  0.496405
                S3       0.000000  0.270593  0.540627  0.188780  0.000000
                S4       0.144627  0.065209  0.060130  0.272958  0.457076
                Unknown  0.491222  0.188258  0.158279  0.162242  0.000000
        E2      S1       0.085831  0.328942  0.233738  0.242986  0.108503
                S2       0.336600  0.189705  0.314877  0.158818  0.000000
                S3       0.000000  0.448532  0.551468  0.000000  0.000000
                S4       0.000000  0.000000  0.248368  0.751632  0.000000
                Unknown  0.235332  0.371369  0.171224  0.222074  0.000000
D2      E1      S1       0.030488  0.272635  0.190137  0.153442  0.353298
                S2       0.000000  0.251659  0.309414  0.438927  0.000000
                S3       0.000000  0.381712  0.351985  0.266302  0.000000
                S4       0.827896  0.000000  0.172104  0.000000  0.000000
                Unknown  0.000000  0.189613  0.611961  0.198426  0.000000
        E2      S1       0.061281  0.223804  0.171979  0.271795  0.271140
                S2       0.124464  0.252529  0.388104  0.234903  0.000000
                S3       0.000000  0.045514  0.125909  0.190519  0.638058
                S4       0.000000  0.034438  0.000000  0.000000  0.965562
                Unknown  0.000000  0.239879  0.258064  0.502057  0.000000

我还有另一个数据框2:

         DT       RE       DS    
0        D1       E1       S1    
1        D1       E1       S2  
2        D2       E1       S2     
3        D2       E2       S3  

我想通过匹配data-frame1中的多级标头值来填充data-frame2。像这样:

         DT       RE       DS    step 0    step 1    step 2    step 3    step 4
0        D1       E1       S1    0.372621  0.211435  0.162299  0.149502  0.104143
1        D1       E1       S2    0.104714  0.106229  0.119725  0.172926  0.496405
2        D2       E1       S2    0.000000  0.251659  0.309414  0.438927  0.000000 
3        D2       E2       S3    0.000000  0.045514  0.125909  0.190519  0.638058

2 个答案:

答案 0 :(得分:1)

创建一个MultiIndexfillna

m_idx = pd.MultiIndex.from_arrays(df2.T.values)
m = pd.DataFrame(index=m_idx, columns=df1.columns)

m.fillna(df1)

            step 0    step 1    step 2    step 3    step 4
D1 E1 S1  0.372621  0.211435  0.162299  0.149502  0.104143
      S2  0.104714  0.106229  0.119725  0.172926  0.496405
D2 E1 S2         0  0.251659  0.309414  0.438927         0
   E2 S3         0  0.045514  0.125909  0.190519  0.638058

如果其他人想插话,这是一种重新创建DataFrames的简单方法:

df1 = pd.DataFrame({'step 0': {('D1', 'E1', 'S1'): 0.372621, ('D1', 'E1', 'S2'): 0.10471400000000002, ('D1', 'E1', 'S3'): 0.0, ('D1', 'E1', 'S4'): 0.144627, ('D1', 'E1', 'Unknown'): 0.49122200000000005, ('D1', 'E2', 'S1'): 0.08583099999999999, ('D1', 'E2', 'S2'): 0.3366, ('D1', 'E2', 'S3'): 0.0, ('D1', 'E2', 'S4'): 0.0, ('D1', 'E2', 'Unknown'): 0.235332, ('D2', 'E1', 'S1'): 0.030488, ('D2', 'E1', 'S2'): 0.0, ('D2', 'E1', 'S3'): 0.0, ('D2', 'E1', 'S4'): 0.827896, ('D2', 'E1', 'Unknown'): 0.0, ('D2', 'E2', 'S1'): 0.061280999999999995, ('D2', 'E2', 'S2'): 0.124464, ('D2', 'E2', 'S3'): 0.0, ('D2', 'E2', 'S4'): 0.0, ('D2', 'E2', 'Unknown'): 0.0}, 'step 1': {('D1', 'E1', 'S1'): 0.21143499999999998, ('D1', 'E1', 'S2'): 0.10622899999999999, ('D1', 'E1', 'S3'): 0.270593, ('D1', 'E1', 'S4'): 0.065209, ('D1', 'E1', 'Unknown'): 0.18825799999999998, ('D1', 'E2', 'S1'): 0.328942, ('D1', 'E2', 'S2'): 0.18970499999999998, ('D1', 'E2', 'S3'): 0.448532, ('D1', 'E2', 'S4'): 0.0, ('D1', 'E2', 'Unknown'): 0.371369, ('D2', 'E1', 'S1'): 0.272635, ('D2', 'E1', 'S2'): 0.251659, ('D2', 'E1', 'S3'): 0.381712, ('D2', 'E1', 'S4'): 0.0, ('D2', 'E1', 'Unknown'): 0.189613, ('D2', 'E2', 'S1'): 0.223804, ('D2', 'E2', 'S2'): 0.252529, ('D2', 'E2', 'S3'): 0.045514, ('D2', 'E2', 'S4'): 0.034437999999999996, ('D2', 'E2', 'Unknown'): 0.239879}, 'step 2': {('D1', 'E1', 'S1'): 0.162299, ('D1', 'E1', 'S2'): 0.119725, ('D1', 'E1', 'S3'): 0.5406270000000001, ('D1', 'E1', 'S4'): 0.060129999999999996, ('D1', 'E1', 'Unknown'): 0.158279, ('D1', 'E2', 'S1'): 0.233738, ('D1', 'E2', 'S2'): 0.314877, ('D1', 'E2', 'S3'): 0.5514680000000001, ('D1', 'E2', 'S4'): 0.24836799999999998, ('D1', 'E2', 'Unknown'): 0.171224, ('D2', 'E1', 'S1'): 0.190137, ('D2', 'E1', 'S2'): 0.30941399999999997, ('D2', 'E1', 'S3'): 0.351985, ('D2', 'E1', 'S4'): 0.172104, ('D2', 'E1', 'Unknown'): 0.611961, ('D2', 'E2', 'S1'): 0.171979, ('D2', 'E2', 'S2'): 0.388104, ('D2', 'E2', 'S3'): 0.125909, ('D2', 'E2', 'S4'): 0.0, ('D2', 'E2', 'Unknown'): 0.25806399999999996}, 'step 3': {('D1', 'E1', 'S1'): 0.149502, ('D1', 'E1', 'S2'): 0.172926, ('D1', 'E1', 'S3'): 0.18878, ('D1', 'E1', 'S4'): 0.272958, ('D1', 'E1', 'Unknown'): 0.162242, ('D1', 'E2', 'S1'): 0.242986, ('D1', 'E2', 'S2'): 0.15881800000000001, ('D1', 'E2', 'S3'): 0.0, ('D1', 'E2', 'S4'): 0.751632, ('D1', 'E2', 'Unknown'): 0.22207399999999997, ('D2', 'E1', 'S1'): 0.153442, ('D2', 'E1', 'S2'): 0.43892700000000007, ('D2', 'E1', 'S3'): 0.266302, ('D2', 'E1', 'S4'): 0.0, ('D2', 'E1', 'Unknown'): 0.198426, ('D2', 'E2', 'S1'): 0.271795, ('D2', 'E2', 'S2'): 0.23490300000000003, ('D2', 'E2', 'S3'): 0.190519, ('D2', 'E2', 'S4'): 0.0, ('D2', 'E2', 'Unknown'): 0.502057}, 'step 4': {('D1', 'E1', 'S1'): 0.104143, ('D1', 'E1', 'S2'): 0.49640500000000004, ('D1', 'E1', 'S3'): 0.0, ('D1', 'E1', 'S4'): 0.45707600000000004, ('D1', 'E1', 'Unknown'): 0.0, ('D1', 'E2', 'S1'): 0.108503, ('D1', 'E2', 'S2'): 0.0, ('D1', 'E2', 'S3'): 0.0, ('D1', 'E2', 'S4'): 0.0, ('D1', 'E2', 'Unknown'): 0.0, ('D2', 'E1', 'S1'): 0.353298, ('D2', 'E1', 'S2'): 0.0, ('D2', 'E1', 'S3'): 0.0, ('D2', 'E1', 'S4'): 0.0, ('D2', 'E1', 'Unknown'): 0.0, ('D2', 'E2', 'S1'): 0.27114, ('D2', 'E2', 'S2'): 0.0, ('D2', 'E2', 'S3'): 0.638058, ('D2', 'E2', 'S4'): 0.965562, ('D2', 'E2', 'Unknown'): 0.0}})
df2 = pd.DataFrame({'DT': {0: 'D1', 1: 'D1', 2: 'D2', 3: 'D2'}, 'RE': {0: 'E1', 1: 'E1', 2: 'E1', 3: 'E2'}, 'DS': {0: 'S1', 1: 'S2', 2: 'S2', 3: 'S3'}})

答案 1 :(得分:0)

有时df2的列会更改其顺序。重新排序。

import pandas as pd
df1 = pd.DataFrame({'step 0': {('D1', 'E1', 'S1'): 0.372621, ('D1', 'E1', 'S2'): 0.10471400000000002, ('D1', 'E1', 'S3'): 0.0, ('D1', 'E1', 'S4'): 0.144627, ('D1', 'E1', 'Unknown'): 0.49122200000000005, ('D1', 'E2', 'S1'): 0.08583099999999999, ('D1', 'E2', 'S2'): 0.3366, ('D1', 'E2', 'S3'): 0.0, ('D1', 'E2', 'S4'): 0.0, ('D1', 'E2', 'Unknown'): 0.235332, ('D2', 'E1', 'S1'): 0.030488, ('D2', 'E1', 'S2'): 0.0, ('D2', 'E1', 'S3'): 0.0, ('D2', 'E1', 'S4'): 0.827896, ('D2', 'E1', 'Unknown'): 0.0, ('D2', 'E2', 'S1'): 0.061280999999999995, ('D2', 'E2', 'S2'): 0.124464, ('D2', 'E2', 'S3'): 0.0, ('D2', 'E2', 'S4'): 0.0, ('D2', 'E2', 'Unknown'): 0.0}, 'step 1': {('D1', 'E1', 'S1'): 0.21143499999999998, ('D1', 'E1', 'S2'): 0.10622899999999999, ('D1', 'E1', 'S3'): 0.270593, ('D1', 'E1', 'S4'): 0.065209, ('D1', 'E1', 'Unknown'): 0.18825799999999998, ('D1', 'E2', 'S1'): 0.328942, ('D1', 'E2', 'S2'): 0.18970499999999998, ('D1', 'E2', 'S3'): 0.448532, ('D1', 'E2', 'S4'): 0.0, ('D1', 'E2', 'Unknown'): 0.371369, ('D2', 'E1', 'S1'): 0.272635, ('D2', 'E1', 'S2'): 0.251659, ('D2', 'E1', 'S3'): 0.381712, ('D2', 'E1', 'S4'): 0.0, ('D2', 'E1', 'Unknown'): 0.189613, ('D2', 'E2', 'S1'): 0.223804, ('D2', 'E2', 'S2'): 0.252529, ('D2', 'E2', 'S3'): 0.045514, ('D2', 'E2', 'S4'): 0.034437999999999996, ('D2', 'E2', 'Unknown'): 0.239879}, 'step 2': {('D1', 'E1', 'S1'): 0.162299, ('D1', 'E1', 'S2'): 0.119725, ('D1', 'E1', 'S3'): 0.5406270000000001, ('D1', 'E1', 'S4'): 0.060129999999999996, ('D1', 'E1', 'Unknown'): 0.158279, ('D1', 'E2', 'S1'): 0.233738, ('D1', 'E2', 'S2'): 0.314877, ('D1', 'E2', 'S3'): 0.5514680000000001, ('D1', 'E2', 'S4'): 0.24836799999999998, ('D1', 'E2', 'Unknown'): 0.171224, ('D2', 'E1', 'S1'): 0.190137, ('D2', 'E1', 'S2'): 0.30941399999999997, ('D2', 'E1', 'S3'): 0.351985, ('D2', 'E1', 'S4'): 0.172104, ('D2', 'E1', 'Unknown'): 0.611961, ('D2', 'E2', 'S1'): 0.171979, ('D2', 'E2', 'S2'): 0.388104, ('D2', 'E2', 'S3'): 0.125909, ('D2', 'E2', 'S4'): 0.0, ('D2', 'E2', 'Unknown'): 0.25806399999999996}, 'step 3': {('D1', 'E1', 'S1'): 0.149502, ('D1', 'E1', 'S2'): 0.172926, ('D1', 'E1', 'S3'): 0.18878, ('D1', 'E1', 'S4'): 0.272958, ('D1', 'E1', 'Unknown'): 0.162242, ('D1', 'E2', 'S1'): 0.242986, ('D1', 'E2', 'S2'): 0.15881800000000001, ('D1', 'E2', 'S3'): 0.0, ('D1', 'E2', 'S4'): 0.751632, ('D1', 'E2', 'Unknown'): 0.22207399999999997, ('D2', 'E1', 'S1'): 0.153442, ('D2', 'E1', 'S2'): 0.43892700000000007, ('D2', 'E1', 'S3'): 0.266302, ('D2', 'E1', 'S4'): 0.0, ('D2', 'E1', 'Unknown'): 0.198426, ('D2', 'E2', 'S1'): 0.271795, ('D2', 'E2', 'S2'): 0.23490300000000003, ('D2', 'E2', 'S3'): 0.190519, ('D2', 'E2', 'S4'): 0.0, ('D2', 'E2', 'Unknown'): 0.502057}, 'step 4': {('D1', 'E1', 'S1'): 0.104143, ('D1', 'E1', 'S2'): 0.49640500000000004, ('D1', 'E1', 'S3'): 0.0, ('D1', 'E1', 'S4'): 0.45707600000000004, ('D1', 'E1', 'Unknown'): 0.0, ('D1', 'E2', 'S1'): 0.108503, ('D1', 'E2', 'S2'): 0.0, ('D1', 'E2', 'S3'): 0.0, ('D1', 'E2', 'S4'): 0.0, ('D1', 'E2', 'Unknown'): 0.0, ('D2', 'E1', 'S1'): 0.353298, ('D2', 'E1', 'S2'): 0.0, ('D2', 'E1', 'S3'): 0.0, ('D2', 'E1', 'S4'): 0.0, ('D2', 'E1', 'Unknown'): 0.0, ('D2', 'E2', 'S1'): 0.27114, ('D2', 'E2', 'S2'): 0.0, ('D2', 'E2', 'S3'): 0.638058, ('D2', 'E2', 'S4'): 0.965562, ('D2', 'E2', 'Unknown'): 0.0}})
df2 = pd.DataFrame({'DT':['D1','D1','D2','D2','D1','D2'], 'RE':['E1','E1','E1','E2','E1','E1'], 'DS':['S1','S2','S2','S3','S1','S2']})
df2 = df2[['DT', 'RE', 'DS']]
print(df1)
print(df2)
m_idx = pd.MultiIndex.from_arrays(df2.T.values)
m = pd.DataFrame(index=m_idx, columns=df1.columns)
m.update(df1)
print(m)