[英]how to groupby and aggregate dynamic columns in pandas
我在 pandas 中有關注 dataframe
code tank nozzle_1 nozzle_2 nozzle_var nozzle_sale
123 1 1 1 10 10
123 1 2 2 12 10
123 2 1 1 10 10
123 2 2 2 12 10
123 1 1 1 10 10
123 2 2 2 12 10
現在,我想生成在 tank 上分組的所有列的累積總和,並取出最后一次觀察。 噴嘴_1 和噴嘴_2 列是動態的,它可能是噴嘴_3,噴嘴_4 ....噴嘴_n 等。我在pandas 中進行以下操作以獲取cumsum
## Below code for calculating cumsum of dynamic columns nozzle_1 and nozzle_2
cols= df.columns[df.columns.str.contains(pat='nozzle_\d+$', regex=True)]
df.assign(**df.groupby('tank')[cols].agg(['cumsum'])\
.pipe(lambda x: x.set_axis(x.columns.map('_'.join), axis=1, inplace=False)))
## nozzle_sale_cumsum is static column
df[nozzle_sale_cumsum] = df.groupby('tank')['nozzle_sale'].cumsum()
從上面的代碼中,我將獲得以下列的 cumsum
tank nozzle_1 nozzle_2 nozzle_var nozzle_1_cumsum nozzle_2_cumsum nozzle_sale_cumsum
1 1 1 10 1 1 10
1 2 2 12 3 3 20
2 1 1 10 1 1 10
2 2 2 12 3 3 20
1 1 1 10 4 4 30
2 2 2 12 5 5 30
現在,我想獲取所有 3 個 cumsum 列的最后一個值,這些列分組在 tank 上。 我可以使用 pandas 中的以下代碼來完成,但它是用列名硬編碼的。
final_df= df.groupby('tank').agg({'nozzle_1_cumsum':'last',
'nozzle_2_cumsum':'last',
'nozzle_sale_cumsum':'last',
}).reset_index()
上面代碼的問題是噴嘴_1_cumsum,而噴嘴_2_cumsum 是硬編碼的,事實並非如此。 如何使用動態列在 pandas 中執行此操作。
怎么樣:
df.filter(regex='_cumsum').groupby(df['tank']).last()
Output:
nozzle_1_cumsum nozzle_2_cumsum nozzle_sale_cumsum
tank
1 4 4 30
2 5 5 30
您還可以將df.filter(...)
替換為df.iloc[:,-3:]
或df[col_names]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.