python - 如何有效地映射 pandas DataFrame 上的转换

标签 python pandas performance dataframe

有点有趣的问题。

我有一个(大) table ,看起来像:

<表类=“s-表”> <标题> transaction_date(索引) store_id department_id 总收入 <正文> '2020-01-01' 商店1 水果 7.50 美元 '2020-01-01' 商店2 水果 $2.75 '2020-01-01' 商店1 蔬菜 47.50 美元 '2020-01-01' 商店2 蔬菜 $8.25 ... ... ... ...

我想改造 gross_revenue列取决于 store_id 的值和department_id .

为了便于讨论,假设我想增加所有 Store1销售额增加25%,增加Veg销售额增加 10%,并且 Fruit销售额提高了 75%(我们暂时不用担心订单)。

我希望用户能够编写:

modifiers = {
    'store_id': {
        'Store1': lambda x: x*1.25
     },
    'department_id: {
        'Veg' : lambda x: x*1.10, 
        'Fruit': lambda x: x*1.75
    }
}

在 Pandas 中是否有一种高效的方法来执行此操作?

作为基准,此代码有效:

from functools import reduce

ans = (table
 .assign(gross_revenue = lambda x: x
     .apply(lambda row: reduce(lambda x, f: f(x), [row['gross_revenue'], 
                                                   modifiers.get(row['business_id'], lambda x: x),
                                                   modifiers.get(row['department_description'], lambda x: x)
                                                  ]), axis=1)
    )
)

但是,需要接近 2 分钟(表有 5-10m 行)。

有人知道更快的方法吗?

提前致谢。

最佳答案

使用 map :

store_adjust = {'Store1': 1.25, 'Store10':1.3}
dep_adjust = {'Veg': 1.10, 'Fruit':1.75}

df['gross_revenue'] *= ( df['store_id'].map(store_adjust).fillna(1) *
                         df['department_id'].map(dep_adjust).fillna(1) )

关于python - 如何有效地映射 pandas DataFrame 上的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65396264/

相关文章:

python - 如何将一列添加到由另一列的前 n 个值的数组组成的 Pandas 数据框中?

python - 使用 loffset 对 pandas DataFrame 重新采样会引入一个小时的额外偏移量

java - 使用 JPA,方法需要 60 秒

performance - 为什么这个 SSE 代码在 Skylake 上没有 VZEROUPPER 的情况下会慢 6 倍?

python - python 中线程特定的 os.chdir 和 mkdir 是什么?

python - 如何根据特定类名加载CIFAR-10数据集?

python - 迭代 Pandas DataFrame 的行 - 根据另一个系列中的值更改系列值?

c++ - 比较 if(...) 和 ? :,哪个更好?

python - 存储循环中的值

python - 当连接键以列表形式给出时,如何修改 Spark 数据框中连接的列?