【问题标题】:The masking (filtering) of pandas dataframe is too slowpandas 数据帧的屏蔽(过滤)太慢了
【发布时间】:2019-07-25 05:45:45
【问题描述】:

我有一个包含大约 19000 行和 3 列(X、Y、Z)的数据框,我正在尝试屏蔽数据框,以便获得 X_max>X>=X_min、Y_max>Y>Y_min 的数据,和 Z_max>Z>Z_min.

在这个例子中,

df['X'] is 0.0, 0.1, 0.2, 0.3, ..., 5.0
df['Y'] is -3.0, -2.9, -2.8, ..., 3.0
df['Z'] is -2.0, -1.9, ..., -1.5

所以,行数是 51 * 61 * 6 = 18666

当我创建屏蔽条件时,大约需要 1 秒。

cond1 = df['X']>=X_min

我有以下 6 个条件,创建 6 个条件大约需要 3-3.5 秒。

start1 = time()
cond1 = df['X']>=X_min
cond2 = df['X']>=X_max
cond3 = df['X']>=Y_min
cond4 = df['X']>=Y_max
cond5 = df['X']>=Z_min
cond6 = df['X']>=Z_max
finish1 = time()
print(finish1 - start1)  # this is about 3-3.5 sec

start2 = time()
df2= df[conjunction(cond1&cond2&cond3&cond4&cond5&cond6)] does not take long.
finish2 = time()
print(finish2 - start2)  # this is about 0.002 sec

顺便说一下,下面的代码花费了相似的时间(3-3.5 秒)。

df2 = df[(df['X']>=X_min)&(df['X']<X_max)&(df['Y']>=Y_min)&(df['Y']<Y_max)&(df['Z']>=Z_min)&(df['Z']<Z_max)]

我怎样才能提高速度?我可以通过保留 pandas 数据框使其更快吗?

【问题讨论】:

    标签: python pandas dataframe filtering masking


    【解决方案1】:

    您可能需要运行df.info() 来仔细检查列的数据类型。数值上的比较应该快得多。如果列是字符串会慢很多。

    【讨论】:

    • 谢谢!!!!该列被定义为“对象”。所以我使用 df['X'] = df['X'].astype(float) 将列更改为浮动,现在它超级快
    • 如果数据帧是从read_csv等IO函数获取的,一个好的做法是使用dtype关键字参数,从一开始就确保列的类型正确。跨度>
    【解决方案2】:

    Pandas .query 往往比通常的索引更快。

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2022-11-10
      • 1970-01-01
      • 2019-01-06
      相关资源
      最近更新 更多