我有一個初始資料框
df1 =
--- --- ---
| A| B| C|
--- --- ---
| 1| 1| 10|
| 1| 2| 11|
| 1| 2| 12|
| 3| 1| 13|
| 2| 1| 14|
| 2| 1| 15|
| 2| 1| 16|
| 4| 1| 17|
| 4| 2| 18|
| 4| 3| 19|
| 4| 4| 19|
| 4| 5| 20|
| 4| 5| 20|
--- --- ---
使用pyspark,我使用視窗函式對資料框進行編碼,使用總和考慮到“A”列并考慮到“B”列排序。
spec = Window.partitionBy('A').orderBy('B')
df1 = df1.withColumn('D',sum('C').over(spec))
df1.show()
--- --- --- -----
| A| B| C| D|
--- --- --- -----
| 1| 1| 10| 10.0|
| 1| 2| 11| 33.0|
| 1| 2| 12| 33.0|
| 2| 1| 14| 45.0|
| 2| 1| 15| 45.0|
| 2| 1| 16| 45.0|
| 3| 1| 13| 13.0|
| 4| 1| 17| 17.0|
| 4| 2| 18| 35.0|
| 4| 3| 19| 54.0|
| 4| 4| 19| 73.0|
| 4| 5| 20|113.0|
| 4| 5| 20|113.0|
--- --- --- -----
是否可以使用 Pandas Dataframe 進行相同的計算?
我嘗試使用
df['D'] = df.sort_values(['A','B']).groupby(['A', 'B'])['C'].transform('cumsum')
但結果不一樣
謝謝
uj5u.com熱心網友回復:
在 Pandas 中,我們可以groupby sumonA和B。然后groupby cumsum就結束了A。要將結果添加回 DataFramerename到新列名,然后join將結果回傳到初始組鍵上的 DataFrame ['A', 'B']:
df1 = df1.join(
df1.groupby(by=['A', 'B'])['C'].sum()
.groupby(level='A').cumsum()
.rename('D'),
on=['A', 'B']
)
df1:
A B C D
0 1 1 10 10
1 1 2 11 33
2 1 2 12 33
3 3 1 13 13
4 2 1 14 45
5 2 1 15 45
6 2 1 16 45
7 4 1 17 17
8 4 2 18 35
9 4 3 19 54
10 4 4 19 73
11 4 5 20 113
12 4 5 20 113
設定:
import pandas as pd
df1 = pd.DataFrame({
'A': [1, 1, 1, 3, 2, 2, 2, 4, 4, 4, 4, 4, 4],
'B': [1, 2, 2, 1, 1, 1, 1, 1, 2, 3, 4, 5, 5],
'C': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 20]
})
uj5u.com熱心網友回復:
您可以sort,然后cumsum在 'A' 內,然后在 ['A', 'B'] 組內groupby max使用,transform以便您可以將結果分配回來。
df1['D'] = (df1.sort_values(['A', 'B'])
.groupby('A')['C'].cumsum()
.groupby([df1['A'], df1['B']]).transform('max'))
A B C D
0 1 1 10 10
1 1 2 11 33
2 1 2 12 33
3 3 1 13 13
4 2 1 14 45
5 2 1 15 45
6 2 1 16 45
7 4 1 17 17
8 4 2 18 35
9 4 3 19 54
10 4 4 19 73
11 4 5 20 113
12 4 5 20 113
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345671.html
