python - 在多列上过滤 Pandas 数据框的最快方法

标签 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++ 启发的)解决方案是使用追加(如 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 在每次调用追加时都会创建一个新的数据帧。谁能建议一种更快/更清洁的方法来做到这一点?谢谢!

最佳答案

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

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

关于python - 在多列上过滤 Pandas 数据框的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394739/

相关文章:

python - 基于 Django 文件的 session - 文件名太长

python - Python 中的实时绘图

python - Pandas DataFrame 多线程没有性能提升

python Pandas : read csv with multiple tables repeated preamble

python - 在 Pandas DataFrame 上使用 float_format 调用 to_string 时出现问题

python - Pandas to_sql 更改数据库表中的数据类型

java - 将 Log4net 与 Google App Engine 后端结合使用

python - 从批处理文件中调用 python 行

Python 3 - 带有 urllib.request 返回 HTML 数据的 POST 请求

python - 从两个 csv 文件组装数据框