如何使用pandas基于某些条件或函数匹配来自不同数据帧的值?

时间:2017-01-14 10:06:02

标签: python pandas match conditional-statements

假设我有两个数据帧,如下所示。

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'])

我想要做的是根据某些条件匹配两个数据帧。 这里的条件是

  1. 如果来自raw_data_2的名称是raw_data_1的值(名称)的子集,当这两个名称按空格分割时,
  2. 国籍应该相同。
  3. 为了便于理解,这里有一个示例:来自raw_data_2'Jason You'.split(' ') = ['Jason', 'You'],因此这是'Jason Love You'.split(' ') = ['Jason', 'Love', 'You']的子集。 但'Molly care wist'.split(' ')不是'Molly care wish'.split(' ')的子集,因为后者并不完全覆盖前者(完美)。 来自'tiger bird'.split(' ')的{​​{1}}是raw_data_2的子集,但他们的国籍不同。

    如果我们符合上述条件,那么最后我想从'tiger legend bird'.split(' ')分配code值。 所以期望的输出(让我们只需要raw_data_2)就像:

    code

    如何使用熊猫来做到这一点?我想这不仅仅是因为' isin'功能或' map'功能

1 个答案:

答案 0 :(得分:1)

使用<=运算符测试子集

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