pandas数据帧组中的快速迭代更改

时间:2017-07-03 21:29:14

标签: python performance pandas

我有一个庞大的熊猫数据框,包括用户,每个用户购买的产品和产品价格。

我正在使用的代码如下所示。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random

# Create Dataframe randomly
product_list = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'P10', 'P11', 'P12']
user_list = ['U1', 'U2', 'U3', 'U4', 'U5', 'U6', 'U7', 'U8', 'U9', 'U10']
price_list = [50, 90, 100]

# Create random transactions
transactions = pd.DataFrame(np.random.choice(user_list, 200))
transactions['item'] = pd.DataFrame(np.random.choice(product_list, 200))
transactions['quantity'] = 1
transactions['price'] = np.random.choice([50, 90, 100], 200)
transactions.columns = ['user', 'item', 'quantity', 'price']
transactions['suggested_price'] = 0

# Create groups to apply suggested discount
grouped = transactions.groupby(["user", "item"])

# Apply suggested discount
for key, group in grouped:
    transactions.set_value(
        group.index, 'suggested_discount', np.random.random())

此代码的最大问题是最后一段代码的性能,它将建议的折扣应用于每个用户(客户)。原始数据框有超过600万行。

另外,我注意到的一件事是最慢的一步是当我改变组的值时,即行:

transactions.set_value(
            group.index, 'suggested_discount', np.random.random())

在原始代码中,在此行代码之前还有其他步骤。

我没想到更改组列的值会非常慢。是否有更好,更快的实施?

谢谢!

1 个答案:

答案 0 :(得分:0)

让我们说,您应该尝试使用np.random.random()apply来代替transform而不是从价格和建议价格列中获取参数的函数。 agg到这些列。标量操作而不是for循环会更快。

例如,首先将useritem字段设置为索引,然后您可以直接将分组数据中的值设置为该新数据帧:

tr=transactions.set_index(["user","item"]) 
tr["suggested discount"]=transactions.groupby(["user", "item"])[["price","suggested_price"]].apply(pd.Series.sum)

无论如何,密钥不使用for循环。