如何根据元组列表过滤数据帧

时间:2018-12-21 07:42:43

标签: python pandas dataframe filter tuples

如何从一组元组中过滤数据帧,以使配对相同?我需要一种更优雅的写作方式。我试图不使用合并,因为这会使合并效率降低。

所以我有一个名为tup_list的元组列表: [('118', '35'), ('35', '35'), ('118', '202') 假设每个元组中的第一个元素为A,第二个元素为B,我试图根据此tup_list过滤数据帧,其中配对必须相同。

原始数据框:

A   B
118 35
118 40
35  202
118 1
35  35

根据tup_list过滤后,新数据帧应为:

A   B
118 35
35  35

仅应返回精确配对。

当前我正在使用df= df.merge(tup_list, on=['A','B'], how='inner'). But is not very efficient as my actual data is larger.

请提出更有效的写作方式。

3 个答案:

答案 0 :(得分:3)

使用布尔索引:

tup_list = [(118, 35), (35, 35), (118, 202)]
df[pd.Series(list(zip(df['A'], df['B']))).isin(tup_list)]

    A   B
0   118 35
4   35  35

list(zip(df['A'], df['B']))将您的两列变成一个元组列表:

[(118, 35), (118, 40), (35, 202), (118, 1), (35, 35)]

您将变成一个系列并使用isin返回一个布尔值:

0     True
1    False
2    False
3    False
4     True
dtype: bool

可用于布尔索引

答案 1 :(得分:0)

借助pandas.DataFrame.query,您还可以根据元组列表过滤数据框

import numpy as np
import pandas as pd

f = [('118', '35'), ('35', '35'), ('118', '202')]
idxs = [df.query('A=='+ t[0] + ' and B==' + t[1]).index.values for t in f]
idxs = np.concatenate(idxs).ravel().tolist()
df2 = df.iloc[idxs,:]
print(df2)
#      A   B
# 0  118  35
# 4   35  35

答案 2 :(得分:0)

使用您的Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute 'filter' 和名为tup_list的数据框,这是请求输出的一个衬里:

df