【问题标题】:Merging selected columns from multiple pandas dataframe by comparing the values通过比较值合并多个熊猫数据框中的选定列
【发布时间】:2017-10-09 12:55:52
【问题描述】:

我有 df1 如下:

id
1
2
3
4
5
6
7

我有 df2 作为:

id1 name1 val1
1   abbb1  10
2   abbb2  20
3   abbb3  30
4   abbb4  40
7   abbb7  70

我有 df3 作为:

id2 name2 val2
1   abbb1  90
2   abbb2  20
5   abbb5  50
6   abbb6  60

所以,我想从 df2df3 中选择值,通过匹配 id 将其添加到 df1。所以,df1 应该如下所示:

id  val1 val2
1   10   90
2   20   20
3   30   0
4   40   0
5   0    40
6   0    60
7   70   0

我一直到这行代码,我就卡住了:

df1 = df1.merge(df2, df3, on=['id'])

请注意:

  • 我不想在预期的输出中出现 name1 和 name2。
  • 如果 val1 或 val2 不存在(比较后),我希望单元格 包含 0。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我认为这里最好使用map

    id1id2df2df3 中也是必要的唯一值。

    df1['val1'] = df1['id'].map(df2.set_index('id1')['val1']).fillna(0).astype(int)
    df1['val2'] = df1['id'].map(df3.set_index('id2')['val2']).fillna(0).astype(int)
    print (df1)
       id  val1  val2
    0   1    10    90
    1   2    20    20
    2   3    30     0
    3   4    40     0
    4   5     0    50
    5   6     0    60
    6   7    70     0
    

    替代方案:

    a = df1['id'].map(df2.set_index('id1')['val1']).fillna(0).astype(int)
    b = df1['id'].map(df3.set_index('id2')['val2']).fillna(0).astype(int)
    df1 = df1.assign(val1=a, val2=b)
    print (df1)
       id  val1  val2
    0   1    10    90
    1   2    20    20
    2   3    30     0
    3   4    40     0
    4   5     0    50
    5   6     0    60
    6   7    70     0
    

    merge 的解决方案:

    df1 = df1.merge(pd.merge(df2.rename(columns={'id1':'id'}), 
                             df3.rename(columns={'id2':'id'}), on='id', how='outer')
                    [['id','val1','val2']].fillna(0).astype(int), how='left')
    print (df1)
       id  val1  val2
    0   1    10    90
    1   2    20    20
    2   3    30     0
    3   4    40     0
    4   5     0    50
    5   6     0    60
    6   7    70     0
    

    【讨论】:

    • 地图是个聪明的主意。因为合并语句开始随着我的真实查询而变得复杂。谢谢!
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2017-09-14
    • 2018-05-10
    • 2020-10-31
    • 2022-11-17
    • 2022-11-27
    • 2020-06-08
    • 2021-10-08
    相关资源
    最近更新 更多