在获取和设置条件复杂的情况下,如何优化数据帧更新的速度?
以下方法(使用.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倍。
答案 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