如何比较两个DataFrames之间panda列的值



我只是想理解,要根据特定列来获取One DataFrame的值,在这种情况下,列IDs存在于两个DataFrame中,我期待着将基于df1的列IDsdf2的列IDs的值进行匹配。因此,如果df1.Keywords的值在df2.Name中,但在df2.Name中有一个以上的值,这将是一个重要的点,在此基础上打印布尔值TrueFalse

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

数据帧优先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创建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)

使用merge通过IDsKeywordsName关联,在您使用groupbyIDsNameapplylambda之后,计算其组中的关键字是否为contains

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

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

根据你试图匹配的内容(这似乎只是你问题中的Id(假设你不在乎匹配NameKeyword列,那么使用isin是合适的,下面的内容应该会给你布尔标志。

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

最新更新