我正在尝试从数据框中创建一个布尔掩码(或索引列表),以指示多列与列表中的某些组合相匹配的位置。下面是一个例子:
import pandas as pd
df = pd.DataFrame({'A': ['alice', 'bob' , 'charlie' , 'dave' , 'dave'],
'B': ['andy' , 'bridget', 'charlotte', 'diana', 'andy'],
'C': ['some' , 'other' , 'stuff' , 'here' , '!' ]})
pairs = pd.DataFrame({'A': ['alice', 'dave'],
'B': ['andy' , 'diana']})
Run Code Online (Sandbox Code Playgroud)
我想要的输出是
[True, False, False, True, False]
Run Code Online (Sandbox Code Playgroud)
或者
[0, 3]
Run Code Online (Sandbox Code Playgroud)
重要的是,我不希望返回行索引4即['dave', 'andy', '!']。我可以通过转换回列表来实现我想要的......但这感觉就像一个很长的路要走,我想有一种“熊猫”的方式来做到这一点!
df_list = df[['A', 'B']].values.tolist()
pairs_list = pairs.values.tolist()
[idx for idx, row in enumerate(df_list) if row in pairs_list]
Run Code Online (Sandbox Code Playgroud)
您可以outer使用indicator=Trueparam执行类型合并并测试是否_merge column == 'both':
In [97]:
merged = df.merge(pairs, how='outer', indicator=True)
merged[merged['_merge'] =='both'].index
Out[97]:
Int64Index([0, 3], dtype='int64')
Run Code Online (Sandbox Code Playgroud)
要获得一个布尔值Series:
In [98]:
merged['_merge'] =='both'
Out[98]:
0 True
1 False
2 False
3 True
4 False
Name: _merge, dtype: bool
Run Code Online (Sandbox Code Playgroud)
合并后的 df 如下所示:
In [99]:
merged
Out[99]:
A B C _merge
0 alice andy some both
1 bob bridget other left_only
2 charlie charlotte stuff left_only
3 dave diana here both
4 dave andy ! left_only
Run Code Online (Sandbox Code Playgroud)