当选择和更新都存在复杂条件时,更新数据框的最快方法是什么?

时间:2019-02-01 17:03:31

标签: python pandas performance numpy dataframe

在获取和设置条件复杂的情况下,如何优化数据帧更新的速度?

以下方法(使用.loc[])效率很低:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [0,0,0,0,1,3,1],
                   'b': [0,2,0,0,4,1,1],
                   'c': [0,0,0,0,1,1,1]})

# GET conditions
np.where(((df['a']==1)&(df['b']==df['a'])))

# SET conditions
np.where(((df['a']==0)&(df['b']>1)))

# Applying GET & SET conditions in update (using .loc[])- 3ms
df.loc[((df['a'] == 0)&(df['b']>1))] = df.loc[((df['a']==1)&(df['b']==df['a']))]

可以使用df.values&numpy的同时保持这两个选择/更新条件降低的执行时间?

更新

使用jpp的答案(将df.values导入numpy并使用掩码进行选择/更新),该操作的运行速度提高了约5500倍。

1 个答案:

答案 0 :(得分:1)

如果Pandas过于昂贵,请考虑将NumPy与高级布尔索引一起使用。

如果只有数字序列,可能会很幸运,并且能够直接修改基础的NumPy数组。但是,没有记录或建议这样做。本质上,建议您在NumPy中进行所有计算,并且仅当/当您有适合熊猫的特定任务时才移至熊猫。

A = df.values
m1 = (A[:, 0] == 0) & (A[:, 1] > 1)
m2 = (A[:, 0] == 1) & (A[:, 1] == A[:, 0])

A[m1] = A[m2]

print(A)
# array([[0, 0, 0],
#        [1, 1, 1],
#        [0, 0, 0],
#        [0, 0, 0],
#        [1, 4, 1],
#        [3, 1, 1],
#        [1, 1, 1]], dtype=int64)

print(df)
#    a  b  c
# 0  0  0  0
# 1  1  1  1
# 2  0  0  0
# 3  0  0  0
# 4  1  4  1
# 5  3  1  1
# 6  1  1  1