【问题标题】:comparing two pandas dataframes with list in column将两个熊猫数据框与列中的列表进行比较
【发布时间】:2016-08-26 00:15:30
【问题描述】:

我有两个数据框 df1 和 df2:

df1 : 
Name A_list
abcd (apple,orange,banana)
bcde (orange,mango)
cdef (apple,pineapple)

df2 :
City B_list
C1   (apple,mango,banana)
C2   (mango)
C3   (pineapple,banana)

我想制作一个新的数据框 df3

Name A_list City
abcd (apple,orange,banana) (C1,C3)
bcde (orange,mango) (C1,C2)
cdef (apple,pineapple) (C1,C3)

即通过 Df1 中的 A_list 并识别每个水果来自的城市。 我不确定如何使用列表 A_list 和 B_list 合并 df1 和 df2

【问题讨论】:

  • 对于第二行的(orange,mango),你的意思是(C1,C2)而不是(C1,C3)
  • 是的,我更正了我的帖子
  • df2 中没有橙色所以我们就忽略它?
  • 是的,忽略 A_list 中 B_list 中不存在的元素,反之亦然
  • 显示您尝试过的内容。

标签: python pandas


【解决方案1】:

设置

df1 = pd.DataFrame([
        ['abcd', ('apple', 'orange', 'banana')],
        ['bcde', ('orange', 'mango')],
        ['cdef', ('apple', 'pineapple')]
    ], columns=['Name', 'A_list'])
df2 = pd.DataFrame([
        ['C1', ('apple', 'mango', 'banana')],
        ['C2', ('mango')],
        ['C3', ('pineapple', 'banana')]
    ], columns=['City', 'B_list'])

按摩数据

s2 = df2.set_index('City').squeeze() \
    .apply(pd.Series) \
    .stack().reset_index(1, drop=True)

s2

City
C1        apple
C1        mango
C1       banana
C2        mango
C3    pineapple
C3       banana
dtype: object

s1 = df1.set_index('Name').squeeze() \
    .apply(pd.Series) \
    .stack().reset_index(1, drop=True)

s1

Name
abcd        apple
abcd       orange
abcd       banana
bcde       orange
bcde        mango
cdef        apple
cdef    pineapple
dtype: object

df3 = pd.merge(*[s.rename('fruit').reset_index() for s in [s1, s2]])

df3

def tuplify(series):
    return tuple(set(series))

df3.groupby('Name') \
    .apply(lambda df: df.drop('Name', axis=1).apply(tuplify)) \
    .rename(columns=dict(fruit='A_list')).reset_index()

请注意,'orange' 已丢失,因为它没有由 'City' 表示。如果你想要同样的A_list

df3 = pd.merge(*[s.rename('fruit').reset_index() for s in [s1, s2]])
df3 = df3.groupby('Name') \
    .apply(lambda df: df.drop('Name', axis=1).apply(tuplify)) \
    .rename(columns=dict(fruit='A_list'))

df3['A_list'] = df1.set_index('Name')['A_list']
df3.reset_index()

【讨论】:

  • 非常好的答案+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多