我有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中的单元格,以便我需要知道这一点。
谢谢。
答案 0 :(得分:2)
如果所有列的MultiIndex
都是可能的:
首先通过DataFrame.set_index
将ID
转换为索引,通过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.assign
和pd.Series.sub
来分配差值。
void
现在,用AsyncTask
将d = 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