【问题标题】:What is the fastest way to update a Dataframe when complex conditions exist for both selection and update?在选择和更新时,在复杂的条件存在时更新DataFrame的最快方法是什么?
【发布时间】:2019-06-26 07:07:08
【问题描述】:

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

以下方法(使用.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 并使用掩码进行选择/更新),该操作的运行速度提高了约 5,500 倍。

【问题讨论】:

  • 我相信您需要分配df.loc[((df['a']==1)&(df['b']==df['a']))].values(注意末尾的.values)才能使您的示例正常工作。
  • 运行该行:df.loc[((df['a'] == 0)&(df['b']>1))] = df.loc[((df['a']==1)&(df['b']==df['a']))].values 产生输出:ValueError: cannot set using a list-like indexer with a different length than the value
  • 好的,你的示例数据对我有用。但很高兴使用 NumPy 解决了您的性能问题。
  • 啊,只有当我在包括.values在内的行上使用%timeit时才产生ValueError。删除它工作正常。使用time.time()df.loc[((df['a'] == 0)&(df['b']>1))] = df.loc[((df['a']==1)&(df['b']==df['a']))].values 行似乎与问题中的原始行具有相同的执行时间。

标签: python pandas performance numpy dataframe


【解决方案1】:

如果 Pandas 过于昂贵,请考虑使用具有高级布尔索引的 NumPy。

如果您只有数字系列,您可能会很幸运,并且能够直接修改底层 NumPy 数组。但是,这没有记录或推荐。从本质上讲,建议您在 NumPy 中进行所有计算,并且仅当您有适合 Pandas 的特定任务时才迁移到 Pandas。

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

【讨论】:

  • 是的,我只有一个数字系列。这是太棒了。我马上试试看。
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 2020-01-05
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2011-02-21
  • 2019-01-30
相关资源
最近更新 更多