假設我有一個包含兩個數字列和一個分類列的資料框:
dftest=pd.DataFrame({
"tau":[1,2,5,1,2,5],
"x" :[4,5,6,7,8,9],
"cat":list("aaabbb")
})
輸出:

我可以輕松計算x每個的平方和cat:
dftest.groupby(["cat"]).apply(
lambda s: pd.Series({
"sum_x^2":(s["x"]**2).sum()
})
)
但現在我的問題是:對于一些具有正確維度和行/列索引的方陣 rho,Sum_i (x_i^2)我該如何計算Sum_{i,j} rho(tau_i, tau_j) * x_i * x_j?作為一個具體的例子,假設我有以下內容rho:
rho = pd.DataFrame({
1:[1, 0.9, 0.8],
2:[0.9, 1, 0.7],
5:[0.8, 0.7, 1]
}).T
rho = rho.rename(columns={0:1, 1:2, 2:5})

對于 category a,我想計算:
rho[1,1] * x[1] * x[1] rho[1,2] * x[1] * x[2] rho[1,5] * x[1] * x[5] ...
... rho[2,1] * x[2] * x[1] ...
或者按照給出的例子:
1*4*4 0.9*4*5 0.8*4*6 ...
0.9*5*4 ...
目前,我通過遍歷 groupby 物件并遍歷 中的索引值來執行此操作rho,但我想知道是否缺少更優雅的方法。
uj5u.com熱心網友回復:
首先是dftest按組為列旋轉1,2,5:
df = dftest.pivot('cat','tau','x')
print (df)
tau 1 2 5
cat
a 4 5 6
b 7 8 9
然后,被整形rho為MultiIndex Series通過DataFrame.stack:
s = rho.stack()
print (s)
1 1 1.0
2 0.9
5 0.8
2 1 0.9
2 1.0
5 0.7
5 1 0.8
2 0.7
5 1.0
dtype: float64
DataFrame.reindex不同級別的重復值:
df1 = df.reindex(s.index, level=0, axis=1)
print (df1)
1 2 5
1 2 5 1 2 5 1 2 5
cat
a 4 4 4 5 5 5 6 6 6
b 7 7 7 8 8 8 9 9 9
df2 = df.reindex(s.index, level=1, axis=1)
print (df2)
1 2 5
1 2 5 1 2 5 1 2 5
cat
a 4 5 6 4 5 6 4 5 6
b 7 8 9 7 8 9 7 8 9
最后是多個與sum:
out = df1.mul(df2).mul(s).sum(axis=1)
print (out)
cat
a 193.4
b 496.4
dtype: float64
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353685.html
標籤:熊猫 pandas-groupby
