[英]Create weighted mean per column in pandas
我有一個 dataframe 並且我想根據 label 列中的值出現的次數創建加權列label
。
df = pd.DataFrame([
['a',1,1,1],
['a',1,23,10],
['a',1,2,2],
['b',1,14,2],
['a',255,255,255]
]
,columns=['w','r','g','b']
)
在label
列中有 4 個實例a和一個b 。 對於 r 列中的r
a ,有三個 1 (75%) 和一個 255 (25%),對於字母b ,有一個 1 (100%)。 如何使用 pandas 將原始矩陣相乘,以便每個值按其出現在列中的次數加權,按列label
分組?
例如,列r
將變為:
[a 1 * 0.75 \\percentages
a 1 * 0.75
a 1 * 0.75
b 1 * 1.0
a 255 * 0.25]
我想對r
、 g
和b
的每一列執行此操作。
我已經設法根據每個 label 出現的次數來計算我的數字,但我不確定如何將其應用回原始 dataframe:
weighted = pd.DataFrame()
cols = [x for x in pw.columns if x != 'w']
for col in cols:
other_col = [x for x in cols if x != col and x!='w'][0]
g = df.groupby(by=['w', col]).agg('count')
w = pd.DataFrame(g.index.get_level_values(1) * (g[other_col] / g[other_col].groupby('w').sum()[g[other_col].index.get_level_values(0)].values))
weighted = pd.concat([weighted, w], axis=0)
weighted
您可以使用transform + value_counts :
percentage = df.groupby('w').transform(lambda x: x.map(x.value_counts(normalize=True)))
print(percentage)
Output
r g b
0 0.75 0.25 0.25
1 0.75 0.25 0.25
2 0.75 0.25 0.25
3 1.00 1.00 1.00
4 0.25 0.25 0.25
如果要覆蓋原來的 DataFrame,請執行以下操作:
df.iloc[:, 1:] = df.groupby('w').transform(lambda x: x.map(x.value_counts(normalize=True)))
print(df)
Output
w r g b
0 a 0.75 0.25 0.25
1 a 0.75 0.25 0.25
2 a 0.75 0.25 0.25
3 b 1.00 1.00 1.00
4 a 0.25 0.25 0.25
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.