我正在尝试从数据框创建一个布尔掩码(或索引列表),以指示多列匹配列表中某些组合的位置。这是一个例子:
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']})
我想要的输出是
[True, False, False, True, False]
或
[0, 3]
重要的是,我不想要返回行索引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]
答案 0 :(得分:2)
您可以与outer
参数执行indicator=True
类型合并,并测试_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')
获取布尔值Series
:
In [98]:
merged['_merge'] =='both'
Out[98]:
0 True
1 False
2 False
3 True
4 False
Name: _merge, dtype: bool
合并的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