Pandas 如何在两个数据帧之间比较列的值

Pandas 如何在两个数据帧之间比较列的值,pandas,Pandas,我只是想了解基于特定列获取一个数据帧的值,即在本例中,两个数据帧中都存在列IDs,我期待着将基于df1s列IDs的值与df2s列IDs匹配,如果df1.Keywords的值在df2.Name中,但df2.Name有一个以上的值,这在这里是一个重要的点,则在此基础上打印布尔值True或False 注意:df1.关键字在df2.名称基于数据帧上的id 数据帧优先df1 >>> df1 IDs Keywords 0 1234 APPLE 1 1234

我只是想了解基于特定列获取一个数据帧的值,即在本例中,两个数据帧中都存在列
IDs
,我期待着将基于
df1
s列
IDs
的值与
df2
s列
IDs
匹配,如果
df1.Keywords
的值在
df2.Name
中,但df2.Name有一个以上的值,这在这里是一个重要的点,则在此基础上打印布尔值
True
False

注意:
df1.关键字在df2.名称
基于数据帧上的
id

数据帧优先
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
数据帧秒
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
创建多索引,但不起作用

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)
如果需要仅基于一个值创建布尔值。。。 根据您试图匹配的内容(这似乎是您问题中唯一的Id),假设您不关心匹配
名称
关键字
列,那么使用是合适的,下面类似的内容应该给出您的布尔标志

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中的结果。继续我的示例中的数据,您将能够使用字符串上的
apply
lambda
split
来隔离您的水果。索引
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

使用
merge
通过
IDs
关键字
名称
关联,在您
groupby
IDs和
Name
之后,
应用
lambda
计算是否有任何名称
包含其组中的关键字:

df.merge(df2).groupby(['IDs','Name']).apply(lambda x: any(x['Name'].str.contains('|'.join(x['Keywords'])))).rename('flag').reset_index()

    IDs     Name              flag
0   1234    APPLE ABCD        True
1   1234    STRAWBERRY YES    False
2   5346    APPLE ABCD        False
3   8793    ORANGE AVAILABLE  False
4   8793    TEA AVAILABLE     True

谢谢你的详细回答,不过我期待着将df1的专栏
关键字
与df2的专栏名称相匹配,很抱歉,看起来mu的问题很清楚,让我在实际的帖子中解释一下,尽管想法是+1。THNX,这是个好问题。