簡體   English   中英

對 pandas dataframe 行進行有效迭代以計算新數據幀的值

[英]Efficient iteration over pandas dataframe rows to calculate values for new data frame

我正在嘗試創建一個 dataframe ,其中列與已售商品的 ID 相關,行索引是購買這些商品的客戶的 ID。 單元格應顯示每個客戶購買了每件商品的數量。 為了獲得這些信息,我閱讀了 CSV 文件,其中包含客戶進行的每筆交易的一行。

該文件被解析為frame_變量。 我使用相應列上的unique() function 檢索客戶和商品 ID,並使用它們創建一個新的 dataframe,並將這些 ID 作為列標題和行索引。

with open(f"{file_path}") as file:
    frame_ = pd.read_csv(file, sep="\t", header=None)
    
    customer_ids = list(frame_[customer_index].unique())
    item_ids = list(frame_[item_index].unique())
    
    frame = pd.DataFrame.from_dict(
        dict.fromkeys(item_ids, dict.fromkeys(customer_ids, 0)))

對於下一步,我想遍歷frame_以檢查每一行的 3 個值:

  1. 客戶ID
  2. 商品編號
  3. 售出物品數量

金額應添加到frame.at[customer_id, item_id]的當前值。

for index, row in frame_.iterrows():
    customer = row[customer_index]
    item = row[item_index]
    amount = abs(float(row[2]))

    frame.at[customer, item] += amount

由於我使用iterrows()這部分特別慢。
我查看了一些問題,但因為我不太清楚我在尋找什么,所以我找不到任何關於如何更有效地執行任務的解決方案。

感謝您抽出寶貴的時間和您可以提供的任何建議。

編輯:原始文件和frame_包含大約 250 萬行

編輯 2:添加了frame_的摘錄,“...”包含與此部分無關的其他信息。 列標題實際上是 0-8,為了便於閱讀,添加了“ID”、“amount”、“itemID”和“customerID”:

ID ... amount ... ... itemID ... customerID ...
1  ... -5.0    ... ... 1258   ... 805214     ...
2  ... -10.0   ... ... 3658   ... 798125     ...
3  ... -7.5    ... ... 2056   ... 589012     ...

編輯 3:預期 output 看起來像這樣:

       1258 3658 2056
805214 5.0  0    0
798125 0    10.0 0
589012 0    0    7.5

首先准備另一列絕對值的金額(雖然我不完全理解你需要什么absfloat - 你的金額不是已經是正數和數字了嗎?):

import numpy as np
frame_["amount1"] = np.abs(frame_["amount"].astype(float))

然后按客戶和項目索引聚合:

frame = frame_.groupby(["customerID", "itemID"])["amount1"].sum()

不需要顯式迭代。 如果需要,您可以將結果轉換為“寬”格式:

frame.unstack().fillna(0)
#itemID      1258  2056  3658
#customerID                  
#589012       0.0   7.5   0.0
#798125       0.0   0.0  10.0
#805214       5.0   0.0   0.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM