亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果缺少列,將權重更改為我的索引

如果缺少列,將權重更改為我的索引

千萬里不及你 2021-11-09 19:37:14
我有一個包含不同國家(行)和 4 個指標(列)A、B、C 和 D 的 Pandas 數據框。對于每個指標,我都有一個特定的權重來計算它們的加權總和,比方說:Weigth_A = 0.2, Weigth_B = 0.2,Weight_C = 0.4,Weight_D = 0.2這是我的加權總和的公式df['W_Sum'] = Weigth_A*df['A'] + Weigth_B*df['B'] + Weigth_C*df['C'] + Weigth_D*df['D']但是,如果一列是 NaN(在這種情況下假設為 D),我需要將加權總和更改為正常平均值;df['W_Sum'] = 0.33*df['A'] + 0.33*df['B'] + 0.33*df['C']如果缺少兩個,則:df['W_Sum'] = 0.5*df['A'] + 0.5*df['B']有沒有辦法使這個過程自動化,因為我不確定每個國家的哪一列會有缺失值?
查看完整描述

2 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

您可以np.where為此使用:


wa = 0.2*df.A + 0.4*df.B + 0.2*df.C

df['new_col'] = np.where(df.isna().any(axis=1), df.mean(axis=1), wa)

例子


df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6], 'C':[7,8,np.nan]})


   A  B    C  

0  1  4  7.0      

1  2  5  8.0      

2  3  6  NaN      


wa = 0.2*df.A + 0.4*df.B + 0.2*df.C

df['new_col'] = np.where(df.isna().any(axis=1), df.mean(axis=1), wa)


   A  B    C  new_col

0  1  4  7.0      3.2

1  2  5  8.0      4.0

2  3  6  NaN      4.5

細節


np.where將根據條件的結果在平均值或加權平均值中進行選擇has_nans:


df.assign(has_nans = df.isna().any(axis=1), mean=df.mean(axis=1), weighted_av = wa)


   A  B    C  new_col  has_nans  mean  weighted_av

0  1  4  7.0      3.2     False  3.80          3.2

1  2  5  8.0      4.0     False  4.75          4.0

2  3  6  NaN      4.5      True  4.50          NaN


查看完整回答
反對 回復 2021-11-09
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

我正要寫與 yatu基本相同的答案,但試圖提高效率。


import pandas as pd

import numpy as np

df = pd.DataFrame({'A':[1,2,3],

                   'B':[4,5,6],

                   'C':[7,8,np.nan],

                   'D':[1, np.nan, np.nan]})

weights = np.array([0.2,0.4,0.2,0.2])


df["w_avg"]= np.where(df.isnull().any(1),

                      df.mean(1),

                      np.dot(df.values, weights))

鑒于沒有必要計算您不會使用的東西。


使用虛擬 dfnp.dot代替wa手動計算在速度和泛化方面更好


n = 5000

df = pd.DataFrame({"A":np.random.rand(n),

                   "B": np.random.rand(n),

                   "C":np.random.rand(n),

                   "D":np.random.rand(n)})


%%timeit

wa = 0.2*df.A + 0.4*df.B + 0.2*df.C + 0.2* df.D

735 μs ± 19.7 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)



%%timeit

wa = np.dot(df.values, weights)

18.9 μs ± 732 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)


查看完整回答
反對 回復 2021-11-09
  • 2 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號