給定一張桌子,
| ID | 價值 |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
| 4 | 6 |
| 2 | 8 |
| 2 | 3 |
| 1 | 1 |
而不是一個簡單的groupby('Id').agg({'Value':'sum'})將在所有實體上執行聚合并產生只有四行的表,我希望結果只在附近的實體上聚合,從而保持創建表的順序。
預期的輸出如下,
| ID | 價值 |
|---|---|
| 1 | 1 |
| 2 | 5 |
| 3 | 4 |
| 4 | 11 |
| 2 | 11 |
| 1 | 1 |
如果熊貓 groupby 不可能,任何其他型別的技巧也將不勝感激。
注意:如果上面的示例沒有幫助,基本上我想要的是通過聚合“值”以某種方式壓縮表。聚合應該只在重復的 'Id's 上完成,它們一個接一個地出現。
uj5u.com熱心網友回復:
不幸的是,來自 eshirvana 和 wwnde 的答案似乎不適用于長資料集。受到 wwnde 回答的啟發,我找到了一個解決方法,
# create a series referring to group of identicals
new=[]
i=-1
for item in df.Id:
if item !=seen:
i =1
seen=items
new.append(i)
df['temp']=new
現在,我們對 'temp' 列進行分組。
df.groupby('temp').agg({'Id':max, 'Value':sum}).reset_index(drop=True)
uj5u.com熱心網友回復:
這是一種方法:
df.groupby([df.Id,(df["Id"] != df.Id.shift(1)).cumsum()])['Value'].sum()
print(df)
輸出:
Id
1 1
1
2 5
11
3 4
4 11
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/399315.html
