簡體   English   中英

在 pandas 中創建每列的加權平均值

[英]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]

我想對rgb的每一列執行此操作。

我已經設法根據每個 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.

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