我只是想理解,要根据特定列来获取One DataFrame的值,在这种情况下,列IDs
存在于两个DataFrame中,我期待着将基于df1
的列IDs
和df2
的列IDs
的值进行匹配。因此,如果df1.Keywords
的值在df2.Name
中,但在df2.Name中有一个以上的值,这将是一个重要的点,在此基础上打印布尔值True
或False
。
注意: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
通过IDs
将Keywords
与Name
关联,在您使用groupby
IDs
与Name
、apply
lambda
之后,计算其组中的关键字是否为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(假设你不在乎匹配Name
和Keyword
列,那么使用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中的水果。继续我的例子中的数据,您将能够使用字符串上的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