熊猫左合并将数据保留在重复列的右数据框中
我想合并两个数据框,df2 可能有更多列,并且总是 1 行。我希望 df2 行中的数据覆盖 df 中的匹配行。注意:ser和no列一起使一行唯一。
import pandas as pd
df = pd.DataFrame({'ser': {0: 0, 1: 0, 2: 0, 3: 1, 4: 1, 5: 1, 6: 2, 7: 2, 8: 2}, 'no': {0: 0, 1: 1, 2: 2, 3: 0, 4: 1, 5: 2, 6: 0, 7: 1, 8: 2}, 'c': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}})
df2 = pd.DataFrame({'ser': {0: 1}, 'no': {0: 2}, 'c': {0: 88}, 'd': {0: 90}})
>>> df
ser no c
0 0 0 1
1 0 1 1
2 0 2 1
3 1 0 1
4 1 1 1
5 1 2 1
6 2 0 1
7 2 1 1
8 2 2 1
>>> df2
ser no c d
0 1 2 88 90
我试过向左合并,但这会创建两个 c 列(c_x 和 c_y):
>>> pd.merge(df,df2,how='left',on=['ser','no'])
ser no c_x c_y d
0 0 0 1 NaN NaN
1 0 1 1 NaN NaN
2 0 2 1 NaN NaN
3 1 0 1 NaN NaN
4 1 1 1 NaN NaN
5 1 2 1 88.0 90.0
6 2 0 1 NaN NaN
7 2 1 1 NaN NaN
8 2 2 1 NaN NaN
期望的输出:
ser no c d
0 0 0 1 NaN
1 0 1 1 NaN
2 0 2 1 NaN
3 1 0 1 NaN
4 1 1 1 NaN
5 1 2 88 90
6 2 0 1 NaN
7 2 1 1 NaN
8 2 2 1 NaN
回答
科学怪人答案
df[['ser', 'no']].merge(df2, 'left').set_axis(df.index).fillna(df)
ser no c d
0 0 0 1.0 NaN
1 0 1 1.0 NaN
2 0 2 1.0 NaN
3 1 0 1.0 NaN
4 1 1 1.0 NaN
5 1 2 88.0 90.0
6 2 0 1.0 NaN
7 2 1 1.0 NaN
8 2 2 1.0 NaN
解释
-
我要合并列
['ser', 'no'],不想在merge调用中指定。另外,我不想要愚蠢的重复列名'c_x','c_y'所以我只切片我想要的共同列然后合并df[['ser', 'no']].merge(df2, 'left') -
合并时,我只需要左侧数据框中的行。但是,
merge通常会生成与原始数据帧截然不同的许多行,因此会生成一个新的index. 但是,注意这是假设正确的数据帧 (df2)没有重复,['ser', 'no']那么 a'left'merge应该产生与左数据帧 (df)相同的确切行数。但它不一定有相同的index。事实证明,在这个例子中确实如此。但我不想冒险。所以我用set_axisset_axis(df.index) -
最后,由于生成的数据帧与
index和columns相同df。我可以用以下方法填充缺失的位:fillna(df)