![](/img/trans.png)
[英]Row iteration over a dataframe to calculate values and add them to new column
[英]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 個值:
金額應添加到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
首先准備另一列絕對值的金額(雖然我不完全理解你需要什么abs
和float
- 你的金額不是已經是正數和數字了嗎?):
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.