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,这是个好问题。