如何与熊猫数据框中的键和键列表合并

Posted

技术标签:

【中文标题】如何与熊猫数据框中的键和键列表合并【英文标题】: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

【问题讨论】:

【参考方案1】:

使用explodemerge

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

另一种方式,使用explodemap

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.joinDataFrame.explodeGroupBy.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

【讨论】:

效果很好,谢谢。

以上是关于如何与熊猫数据框中的键和键列表合并的主要内容,如果未能解决你的问题,请参考以下文章

如何合并熊猫数据框中的两列,堆叠在顶部

如何使用嵌套字典列表展平熊猫数据框中的列

如何将列表中的值分配给熊猫数据框并控制每个列表元素在数据框中的分布/频率

将嵌套的键/值和嵌套列表合并到 json

基于多个值合并熊猫数据框中的行

如何将包含列表的列转换为熊猫数据框中的单独列? [复制]