簡體   English   中英

Pandas groupby 和多列的加權總和

[英]Pandas groupby and weighted sum for multiple columns

我已經看到十幾個 Pandas groupby 多列問題,但我不知道如何在合理的時間內運行它。 我的目標是對幾列進行np.dot ,並根據我的權np.dot每個剩余的列中應用np.dot生成的子集:

# Example data:
weights = np.array([.20, .60, .20])
data = pd.DataFrame([[0, "TX", 10, 55], [0, "TX", 5, 30], [0, "TX", 2, 75], [1, "TX", 4, 30], [1, "TX", 8, 100], [1, "TX", 2, 30]], columns=["sim", "state", "x1", "x2"])

print(data)
   sim state  x1   x2
0    0    TX  10   55
1    0    TX   5   30
2    0    TX   2   75
3    1    TX   4   30
4    1    TX   8  100
5    1    TX   2   30

我無法讓np.dot開箱即用,所以我不得不將乘法和求和分解為單獨的步驟。 這是我嘗試過的,但在我的幾百萬行數據集上,這需要大約 2 分鍾,更不用說非常不可讀了:

results = data.groupby(["sim", "state"]).apply(lambda sdf: (sdf[["x1", "x2"]] * weights.reshape((3,1))).sum())

print(results.reset_index())
   sim state   x1    x2
0    0    TX  5.4  44.0
1    1    TX  6.0  72.0

怎么樣...

(df.set_index(['sim', 'state'])
   .mul(np.tile(weights, len(df) // len(weights)), axis=0)
   .sum(level=[0, 1]))

            x1    x2
sim state           
0   TX     5.4  44.0
1   TX     6.0  72.0

這是如何運作的,

  • 將索引設置為不應相乘的任何值(本質上是df的主鍵)
  • 使用mul與權重執行廣播乘法
  • 對指數進行分組並對加權值求和。

這是在len(df) % len(weights) == 0的假設下工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM