我有2个数据框:
df1 =
item shop revenue
0 1 0 0.0
1 2 1 0.0
2 3 2 0.0
df2 =
item shop revenue
0 1 0 33
1 2 1 244
2 3 2 124
3 4 3 26
我想根据商品和商店的平等程度来映射df2
的收入值。首先,我通过组合两列并将它们用作索引来以痛苦的方式进行操作。然后映射值,最后删除多余的列。
df1['new_id']=df1["shop"].astype(str) +"_"+ df1["item"].astype(str)
df2['new_id']=df2["shop"].astype(str) +"_"+ df2["item"].astype(str)
df1 = df1.set_index("new_id")
df1.update(df2.set_index("new_id"))
df1 = df1.reset_index()
df1 = df1.drop(['new_id'],axis=1)
df2 = df2.drop(['new_id'],axis=1)
df1 =
item shop revenue
0 1 0 33.0
1 2 1 244.0
2 3 2 124.0
必须有一种更好,更简洁的方法来使用更简单的代码。 您能给我建议一个更好的方法吗?
答案 0 :(得分:2)
您可以使用DataFrame.merge
,方法是选择df1
中的2列,而没有on
参数用于按列交叉来合并:
df = df1[['item','shop']].merge(df2)
所以它的工作方式类似于:
df = df1[['item','shop']].merge(df2, on=['item','shop'])
您的解决方案应以MultiIndex
的两列更改为DataFrame.set_index
:
df11 = df1.set_index(['item','shop'])
df11.update(df2.set_index(['item','shop']))
df = df11.reset_index()