根据列(数组)中的公共值连接两个数据框

时间:2020-09-26 17:21:10

标签: pandas dataframe join

我有一个数据帧-df_similar_strings,看起来像这样:

|---------------------|
|     string_values   |
|---------------------|
|  ['catish', 'cat']  |
|---------------------|
|  ['doggo', 'dogy']  |
|---------------------|

和另一个-df_source

|-----------------------------|------------------|
|             values          |     key_value    |
|-----------------------------|------------------|
|  ['catish', 'cat', 'cat-']  |        cat       |
|-----------------------------|------------------|
|  ['doggo', 'dogy', 'dog']   |        dog       |
|-----------------------------|------------------|

我想基于列string_valuesvalues连接那些数据帧,以便至少有一个值匹配。 我不知道如何执行此操作,因为列嵌套为数组。

2 个答案:

答案 0 :(得分:1)

嘿,您只需要输入将列表强制转换为元组即可。然后尝试合并。由于列表不可散列,因此无法应用合并操作。试试这个

df_source.values = df_source["values"].apply(lambda x: tuple(x))

与其他df类似,并尝试使用pd merge进行合并。

答案 1 :(得分:1)

您可以先在两个数据框之间进行笛卡尔乘积运算,然后从该数据框中删除所有没有共享值的行来解决此问题。

为简单起见,我假设两个数据集上的列具有相同的名称(“值”)。另外,我假设列表中没有重复的值(所有值都出现一次)。

from collections import Counter

def find_duplicates(arr):
    return [item for item,count in Counter(arr).items() if count==2]

df1['key']=1
df2['key']=1
cartes_prod_df = df1.merge(df2,on=['key'],how='outer').drop(columns=['key'])
duplicate_values = (cartes_prod_df.values_x + cartes_prod_df.values_y).apply(find_duplicates)

merged_df = cartes_prod_df[duplicate_values.apply(lambda x: len(x)>0)]

我使用了一些技巧来做笛卡尔积(添加key列),然后是从联合数组中找到的duplicate_values(使用+运算符) )是在关节数组中出现两次的值。

更新

为了提供完整的示例,下面是df1df2的示例:

d1 = {'values': [['A','B'],['B','C'],['D']],'otherkey':[1,2,3]}

d2 = {'values': [['A'],['B'],['A','C'],['D']],'otherkey':[4,5,3,6]}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

现在,merged_df将给出输出: enter image description here