我正在嘗試聚合一個包含購買的資料集,我已經縮短了這篇文章中的示例以保持簡單。根據用于識別客戶和交易的兩個不同列來區分購買。參考指的是同一筆交易,而 ID 指的是交易的型別。
我想根據 ID 對這些記錄求和,但同時牢記參考而不是重復計算大小。我提供的示例清楚地說明了這一點。
如果您知道我可以在 pandas 或 Python 中做什么,請告訴我。
這基本上是我所擁有的,
| 姓名 | 參考 | 邊 | 尺寸 | ID |
|---|---|---|---|---|
| 亞歷克斯 | 0 | 買 | 2400 | 0 |
| 亞歷克斯 | 0 | 買 | 2400 | 0 |
| 亞歷克斯 | 0 | 買 | 2400 | 0 |
| 亞歷克斯 | 1 | 買 | 3000 | 0 |
| 亞歷克斯 | 1 | 買 | 3000 | 0 |
| 亞歷克斯 | 1 | 買 | 3000 | 0 |
| 亞歷克斯 | 2 | 賣 | 4500 | 1 |
| 亞歷克斯 | 2 | 賣 | 4500 | 1 |
| 山姆 | 3 | 買 | 1500 | 2 |
| 山姆 | 3 | 買 | 1500 | 2 |
| 山姆 | 3 | 買 | 1500 | 2 |
我想要實作的是以下,
| 姓名 | 邊 | 尺寸 | ID |
|---|---|---|---|
| 亞歷克斯 | 買 | 5400 | 0 |
| 亞歷克斯 | 賣 | 4500 | 1 |
| 山姆 | 買 | 1500 | 2 |
uj5u.com熱心網友回復:
使用drop_duplicates,groupby和agg:
new_df = df.drop_duplicates().groupby(['Name', 'Side']).agg({'Size': 'sum', 'ID': 'first'}).reset_index()
輸出:
>>> new_df
Name Side Size ID
0 Alex BUY 5400 0
1 Alex SELL 4500 1
2 Sam BUY 1500 2
uj5u.com熱心網友回復:
只需先洗掉重復項,然后與串列聚合
這樣的事情應該做(未經測驗)
我總是喜歡在之后重置索引
IE
df.drop_duplicates().groupby(["Name","Side","ID"]).sum()["Size"].reset_index()
要么
# stops the double counts
df_dropped = df.drop_duplicates()
# groups by all the fields in your example
df_grouped = df_dropped.groupby(["Name","Side","ID"]).sum()["Size"]
# resets the 3 indexes created with above
df_reset = df_grouped.reset_index()
uj5u.com熱心網友回復:
編輯: richardec 的解決方案更好,因為這也將匯總 ID 列。
只要名稱是唯一的,這個雙重 groupby 應該可以實作您想要的輸出。
df.groupby(['Name', 'Reference']).max().groupby(['Name', 'Side']).sum()
說明:首先我們按名稱和參考分組以獲得以下資料幀。“.max()”也可以是“.min()”或“.mean()”,因為您的資料似乎每個唯一事務的大小相同:
| 姓名 | 參考 | 邊 | 尺寸 | ID |
|---|---|---|---|---|
| 亞歷克斯 | 0 | 買 | 2400 | 0 |
| 1 | 買 | 3000 | 0 | |
| 2 | 賣 | 4500 | 1 | |
| 山姆 | 3 | 買 | 1500 | 2 |
然后我們通過“.sum()”操作將這些資料按 Name 和 Side 分組以獲得最終結果。
| 姓名 | 邊 | 尺寸 | ID |
|---|---|---|---|
| 亞歷克斯 | 買 | 5400 | 0 |
| 賣 | 4500 | 1 | |
| 山姆 | 買 | 1500 | 2 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446236.html
上一篇:在Python3.10中使用concat將字典添加到PandasDataFrame中的一行
下一篇:從groupby轉換生成資料幀
