gpt4 book ai didi

python - Pandas 左合并将数据保存在重复列的右数据框中

转载 作者:行者123 更新时间:2023-12-03 20:00:54 30 4
gpt4 key购买 nike

我想合并两个数据框,df2 可能有更多列,并且总是 1 行。我希望 df2 行中的数据覆盖 df 中的匹配行。注意:serno列一起使行唯一。

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']然后是 'left' merge应该产生与左侧数据帧( df )相同的确切行数。但它不会有相同的 index一定。事实证明,在这个例子中确实如此。但我不想冒险。所以我使用 set_axis
      set_axis(df.index)
  • 最后,由于结果数据帧具有相同的 indexcolumnsdf .我可以用以下方法填充缺失的位:
    fillna(df)
  • 关于python - Pandas 左合并将数据保存在重复列的右数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66786090/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com