如何在熊猫中与MultiIndex串联

时间:2020-06-07 06:32:35

标签: python pandas

我有2个这样的数据框:

df1

ID      Value1      Amount2
1        100         10
2        400         20
3        300         50
df2

ID      Value1     Amount2
2        200         20
3        300         30

我想从这两个dfs中获得一个像这样的表。

Desired Output:

ID      Value        Amount       Difference_Value         Difference_Amount
      df1    df2    df1   df2        
1     100     0     10     0            100                      10
2     400    200    20    20            200                       0
3     300    300    50    30             0                       20

我对多级索引有点陌生。我知道这是可能的,但没有发现其他对我有帮助的问题。

我需要将此Value, Amount, Difference_Value and Difference_amount列合并为excel中的单元格,以便我需要知道这一点。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果所有列的MultiIndex都是可能的:

首先通过DataFrame.set_indexID转换为索引,通过DataFrame.sub减去并通过concat连接在一起,最后进行更改MultiIndex,{{3} }和DataFrame.swaplevel

df1 = df1.set_index('ID')
df2 = df2.set_index('ID')

df3 = df1.sub(df2, fill_value=0)

df = (pd.concat([df1, df2, df3], axis=1, keys=(['df1','df2', 'diff']))
        .swaplevel(1,0, axis=1)
        .fillna(0)
        .sort_index(axis=1))
print (df)
   Amount2             Value1              
       df1   df2  diff    df1    df2   diff
ID                                         
1       10   0.0  10.0    100    0.0  100.0
2       20  20.0   0.0    400  200.0  200.0
3       50  30.0  20.0    300  300.0    0.0

如果尝试将MultiIndex和没有MultiIndex数据帧连接在一起,请改为获取元组MultiIndex

df1 = df1.set_index('ID')
df2 = df2.set_index('ID')

df3 = df1.sub(df2, fill_value=0)

df = (pd.concat([df1, df2, df3], axis=1, keys=(['df1','df2']))
        .swaplevel(1,0, axis=1)
        .fillna(0)
        .sort_index(axis=1)
        .join(df3.add_prefix('Diff_')))
print (df)
    (Amount2, df1)  (Amount2, df2)  (Value1, df1)  (Value1, df2)  Diff_Value1  \
ID                                                                              
1               10             0.0            100            0.0        100.0   
2               20            20.0            400          200.0        200.0   
3               50            30.0            300          300.0          0.0   

    Diff_Amount2  
ID                
1           10.0  
2            0.0  
3           20.0 

答案 1 :(得分:1)

您可以尝试使用df.merge,然后使用pd.index.str.split拆分列

使用df.assignpd.Series.sub来分配差值。

void

现在,用AsyncTaskd = df.merge(df1,how='outer',on='ID',suffixes=('-df1','-df2') ).fillna(0) d ID Value1-df1 Amount2-df1 Value1-df2 Amount2-df2 0 1 100 10 0.0 0.0 1 2 400 20 200.0 20.0 2 3 300 50 300.0 30.0 d = d.assign(diff_value = d['Value1-df1'].sub(d['Value1-df2']), diff_amount = d['Amount2-df1'].sub(d['Amount2-df2'])).set_index('ID') d Value1-df1 Amount2-df1 Value1-df2 Amount2-df2 diff_value diff_amount ID 1 100 10 0.0 0.0 100.0 10.0 2 400 20 200.0 20.0 200.0 0.0 3 300 50 300.0 30.0 0.0 20.0 的列拆分为'-',然后使用df.sort_index

expand=True