如何比较两个DataFrame之间的Pandas列的值

时间:2018-11-17 11:59:17

标签: pandas

我只是试图了解基于特定列(例如,在此情况下,两个数据帧中都存在的列IDs)来获取一个DataFrame的值,我期待基于df1IDsdf2IDs因此,如果df1.Keywords的值在df2.Name中,但df2.Name具有更多的值,则一个可能很重要的值会根据此值打印布尔值TrueFalse

注意: df1.Keywords isin df2.Name基于IDs在数据帧的展位上。

DataFrame首先 df1

>>> df1
    IDs    Keywords
0  1234       APPLE
1  1234      ORANGE
2  1234      LEMONS
3  5346      ORANGE
4  5346  STRAWBERRY
5  5346   BLUEBERRY
6  8793         TEA

DataFrame秒 df2

>>> df2
    IDs              Name
0  1234        APPLE ABCD
1  5346        APPLE ABCD
2  1234    STRAWBERRY YES
3  8793  ORANGE AVAILABLE
4  8793     TEA AVAILABLE

预期:

IDs    Name               New_Bools
1234   APPLE ABCD ONE     True
5346   APPLE ABCD         False
1234   STRAWBERRY YES     False
8793   ORANGE AVAILABLE   False
8793   TEA AVAILABLE      False
8793   TEA COFFEE         True

我尝试使用isin创建MultiIndex,但无法正常工作。

index1 = pd.MultiIndex.from_arrays([df1[col] for col in ['IDs', 'Keywords']])
index2 = pd.MultiIndex.from_arrays([df2[col] for col in ['IDs', 'Name']])

df1.IDs.isin(df2.IDs)

2 个答案:

答案 0 :(得分:1)

如果您只需要基于一个值创建布尔值...

取决于您要匹配的内容(似乎只是问题的ID)假设您不关心匹配NameKeyword列,然后使用{{3} }是合适的,如下所示应会为您提供布尔标志。

import pandas as pd

data = {'Id': [1, 2, 3, 1, 2, 3, 1, 2], 'Val': ['ABC', 'BCD', 'CDE', 'DEF', 'EFG', 'HIJ', 'IJK', 'JKL']}
data2 = {'Id': [1, 4, 7, 1, 2, 0, 1, 5], 'Val': ['ABC pld', 'BCD iod', 'CDE jkdf', 'DEF uyt', 'EFG erf', 'HIJ dfd', 'IJK mnb', 'JKL jkdf']}


df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)

df['New_Bools'] = df['Id'].isin(df2['Id'])
print(df)

输出

   Id  Val       Id_In_DF2
0   1  ABC       True
1   2  BCD       True
2   3  CDE      False
3   1  DEF       True
4   2  EFG       True
5   3  HIJ      False
6   1  IJK       True
7   2  JKL       True

如果您需要在多个列和值上进行匹配...

如果您确实关心名称的匹配(您的预期输出),则需要执行其他字符串操作以隔离df2中的结果。继续本例中的数据,您将可以在字符串上使用applylambdasplit隔离水果。索引0将为您带来成果。

最后,您可以使用遮罩比较两个帧之间的数据并输出布尔值。

# string manipulation for df2
df2['Name'] = df2['Val'].apply(lambda x: x.split(' ')[0])

# perform your eval like this:
df['New_Bools_Id_And_Name'] = ((df['Id'] == df2['Id']) & (df['Val'] == df2['Name']))

哪个输出

    Id  Val  New_Bools  New_Bools_Id_And_Name
0   1  ABC       True                   True
1   2  BCD       True                  False
2   3  CDE      False                  False
3   1  DEF       True                   True
4   2  EFG       True                   True
5   3  HIJ      False                  False
6   1  IJK       True                   True
7   2  JKL       True                  False

答案 1 :(得分:1)

在您merge KeywordsName之后,使用IDs通过groupbyIDsName关联起来,{{ 1}} apply来计算lambda是否属于其组中的关键字:

contains