我有一个数据帧-df_similar_strings
,看起来像这样:
|---------------------|
| string_values |
|---------------------|
| ['catish', 'cat'] |
|---------------------|
| ['doggo', 'dogy'] |
|---------------------|
和另一个-df_source
:
|-----------------------------|------------------|
| values | key_value |
|-----------------------------|------------------|
| ['catish', 'cat', 'cat-'] | cat |
|-----------------------------|------------------|
| ['doggo', 'dogy', 'dog'] | dog |
|-----------------------------|------------------|
我想基于列string_values
和values
连接那些数据帧,以便至少有一个值匹配。
我不知道如何执行此操作,因为列嵌套为数组。
答案 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
(使用+
运算符) )是在关节数组中出现两次的值。
更新
为了提供完整的示例,下面是df1
和df2
的示例:
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)