从pandas数据框中选择行,其中两列匹配对列表

时间:2016-07-19 10:44:02

标签: python pandas

我正在尝试从数据框创建一个布尔掩码(或索引列表),以指示多列匹配列表中某些组合的位置。这是一个例子:

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]

1 个答案:

答案 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