2017-07-03 100 views
0

我有一個大型熊貓數據框,由用戶,每個用戶購買的產品和產品價格組成。熊貓數據框組中的快速迭代更改

我使用的代碼如下所示。

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()) 

在原來的代碼有這行代碼之前其他步驟。

我沒想到改變組列的值會很慢。有更好,更快的實施嗎?

謝謝!

回答

0

比方說,而不是np.random.random()你有一個函數,它從價格參數和建議價格列,你應該嘗試要麼使用applytransformagg那些列。標量操作而不是循環會更快。

例如,首先設置useritem字段爲指標,則可以直接從分組數據中設置的值,以該新的數據幀:

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

總之,密鑰不使用for循環。