【问题标题】:how can merge with key and list of keys in pandas dataframe如何与熊猫数据框中的键和键列表合并
【发布时间】:2022-01-17 13:55:07
【问题描述】:

df1 中有一个键,df2 有一个包含键列表的列

df1 = pd.DataFrame({"key": ["D0", "D1", "D3", "D5", "D7"]})
df2 = pd.DataFrame({"keys" : [['D0','D1','D2'], ['D1','D2','D5'], ['D6','D7','D8'], ['D9','D10','D11', 'D12']],
                    "value" : [10, 20, 30, 40]})

df1:

    key
0   D0
1   D1
2   D3
3   D5
4   D7

df2:

    keys                value
0   [D0, D1, D2]        10
1   [D1, D2, D5]        20
2   [D6, D7, D8]        30
3   [D9, D10, D11, D12] 40

我想使用 'key' 列和 'keys' 列合并 df1 和 df2 并保留 'first' 以防重复值(例如 'D1')

df3:

    key value
0   D0  10.0
1   D1  10.0
2   D3  NaN
3   D5  20.0
4   D7  30.0

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    使用explode 和merge:

    df3 = df1.merge(df2.explode('keys'), left_on='key', right_on='keys', how='left') \
             .drop_duplicates('key').drop(columns='keys')
    print(df3)
    
    # Output:
      key  value
    0  D0   10.0
    1  D1   10.0
    3  D3    NaN
    4  D5   20.0
    5  D7   30.0
    

    另一种方式,使用explode 和map:

    df3 = df1.assign(value=df1['key'].map(df2.explode('keys').drop_duplicates('keys') \
                                             .set_index('keys')['value']))
    print(df3)
    
    # Output:
      key  value
    0  D0   10.0
    1  D1   10.0
    2  D3    NaN
    3  D5   20.0
    4  D7   30.0
    

    【讨论】:

    • 非常感谢...我不知道爆炸。
    【解决方案2】:

    将DataFrame.join 与DataFrame.explode 和GroupBy.first 一起使用:

    df = df1.join(df2.explode('keys').groupby('keys').first(), on='key')
    print (df)
      key  value
    0  D0   10.0
    1  D1   10.0
    2  D3    NaN
    3  D5   20.0
    4  D7   30.0
    

    【讨论】:

    • 效果很好,谢谢。
    猜你喜欢
    • 2021-09-02
    • 2020-05-30
    • 1970-01-01
    • 2023-02-02
    • 2018-08-03
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多