【问题标题】:Pandas performance slicing on Index vs slicing on ColumnsPandas 在索引上的性能切片与在列上的切片
【发布时间】:2018-08-20 13:01:03
【问题描述】:

我有一个相当大的 Pandas 数据帧(3000 万行),我需要一遍又一遍地切片,因此性能至关重要。 需要对一列的值和另一列中的值列表进行切片。 我尝试了两种不同的方法,可以用下面的例子来说明:

import numpy as np
import pandas as pd

df = pd.DataFrame(
    np.random.randint(1,1000,(10000000,4)),
    columns=['A','B','C','D']
).set_index(['A','B'])

# The values I'm looking for
index_a = np.random.randint(1,1000)  # One value
index_b = np.random.randint(1,1000,150)  # A list of values

# Slicing over the multi-index
idx = pd.IndexSlice
%timeit df.loc[idx[index_a, list(index_b)], :]

# Slicing over column values
df1 = df.reset_index()
%timeit df1.loc[(df1.A == index_a) & (df1.B.isin(index_b))]

在我的机器上,这两种情况的性能确实截然不同:

对索引进行切片:

每个循环 3.92 秒 ± 111 毫秒(7 次运行的平均值 ± 标准偏差,每次 1 个循环)

对列进行切片:

每个循环 2.15 秒 ± 77.1 毫秒(7 次运行的平均值 ± 标准偏差,每次 1 个循环)

对多索引进行切片比对列进行切片要慢得多。

这是预期的行为吗?有没有办法优化切片过程?

谢谢

【问题讨论】:

    标签: python python-3.x pandas slice


    【解决方案1】:

    我最终解决了将数据分组到一个索引中的问题,这将切片速度提高了 10 倍以上。 示例:

    df_g = df.groupby(by='A')
    
    def slice_it(ia, ib):
        tg = df_g.get_group(ia)
        return tg.loc[tg.B.isin(index_b)]
    
    %timeit slice_it(index_a, index_b)
    

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2012-07-03
      • 2016-10-09
      • 2018-07-29
      • 2018-10-07
      • 1970-01-01
      • 2015-03-16
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多