在多列上过滤pandas数据帧的最快方法

时间:2016-07-15 11:13:26

标签: python pandas

我有一个pandas数据框,其中有几列标记最终列中的数据,例如

df = pd.DataFrame( {'1_label' : ['a1','b1','c1','d1'],
                    '2_label' : ['a2','b2','c2','d2'],
                    '3_label' : ['a3','b3','c3','d3'],
                    'data'    : [1,2,3,4]})

df =      1_label 2_label 3_label  data
     0      a1      a2      a3     1
     1      b1      b2      b3     2
     2      c1      c2      c3     3
     3      d1      d2      d3     4

和元组列表,

list_t = [('a1','a2','a3'), ('d1','d2','d3')]

我想过滤此数据框并返回一个新的数据框,其中只包含与列表中的元组对应的行。

result =        1_label 2_label 3_label  data
            0      a1      a2      a3     1
            1      d1      d2      d3     4

我的天真(和C ++启发)解决方案是使用append(如vector :: push_back)

for l1, l2, l3 in list_t:
    if df[(df['1_label'] == l1) & 
          (df['2_label'] == l2) & 
          (df['3_label'] == l3)].empty is False:
        result = result.append(df[(df['1_label'] == l1) & 
                              (df['2_label'] == l2) &
                              (df['3_label'] == l3)]

虽然我的解决方案有效,但我怀疑大型数据帧和大型元组列表的速度非常慢,因为我认为pandas会在每次追加调用时创建一个新的数据帧。有谁能建议更快/更清洁的方法来做到这一点?谢谢!

2 个答案:

答案 0 :(得分:4)

如果我理解正确,合并应该做的工作:

pd.DataFrame(list_t, columns=['1_label', '2_label', '3_label']).merge(df)
Out[73]: 
  1_label 2_label 3_label  data
0      a1      a2      a3     1
1      d1      d2      d3     4

答案 1 :(得分:4)

假设没有重复项,您可以在要“过滤”的列中创建索引:

In [10]: df
Out[10]: 
  1_label 2_label 3_label  data
0      a1      a2      a3     1
1      b1      b2      b3     2
2      c1      c2      c3     3
3      d1      d2      d3     4

In [11]: df.set_index(['1_label', '2_label', '3_label'])\
    .loc[[('a1','a2','a3'), ('d1','d2','d3')]]\
    .reset_index()
Out[11]: 
  1_label 2_label 3_label  data
0      a1      a2      a3     1
1      d1      d2      d3     4