假设我有两个数据框,如下所示。
raw_data = {
'name': ['Jason love you', 'Molly hope wish care', 'happy birthday', 'dog cat', 'tiger legend bird'],
'nationality': ['USA', 'USA', 'France', 'UK', 'UK']
}
raw_data_2 = {
'name_2': ['Jason you', 'Molly care wist', 'hapy birthday', 'dog', 'tiger bird'],
'nationality': ['USA', 'USA', 'France', 'UK', 'JK'],
'code': ['a', 'b','c','d','e']
}
df1 = pd.DataFrame(raw_data, columns = ['name', 'nationality'])
df2 = pd.DataFrame(raw_data_2, columns = ['name_2', 'nationality', 'code'])
我想要做的是根据某些条件匹配两个数据帧。 这里的条件是
- 如果
raw_data_2
中存在一个名称,当这两个名称被空格分隔时,该名称是raw_data_1
中的值(名称)的子集,并且 - 国籍应相同。
为了更容易理解,这里有一个示例:来自 raw_data_2
,'Jason You'.split(' ') = ['Jason', 'You']
,所以这个是 'Jason Love You'.split(' ') = ['Jason', 'Love', 'You']
的子集。
但是 'Molly care wist'.split(' ')
不是 'Molly care Wish'.split(' ')
的子集,因为后者不涵盖前者完全地(完美地)。
raw_data_2
中的 'tigerbird'.split(' ')
是 'tiger legendbird'.split(' ')
的子集,但是他们的国籍不同。
如果我们满足上述条件,那么最后我想分配 raw_data_2
中的 code
值。
因此,所需的输出(让我们只使用代码
)将是这样的:
'a'(matched), Nan(unmatched), Nan(unmatched), 'd', Nan(unmatched)
如何使用 pandas 来做到这一点?我想这不仅仅是“isin”函数或“map”函数那么简单。
最佳答案
使用<=
测试子集的运算符
name = df1.name.str.split().apply(set)
name2 = df2.name_2.str.split().apply(set)
cond1 = name2 <= name
cond2 = df1.nationality == df2.nationality
pd.concat([df1, df2], axis=1, keys=['df1', 'df2']).loc[cond1 & cond2]
df1 df2
name nationality name_2 nationality code
0 Jason love you USA Jason you USA a
3 dog cat UK dog UK d
关于python - 如何使用 pandas 根据某些条件或函数匹配来自不同数据帧的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41648768/