如何从一组元组中过滤数据帧,以使配对相同?我需要一种更优雅的写作方式。我试图不使用合并,因为这会使合并效率降低。
所以我有一个名为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.
请提出更有效的写作方式。
答案 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