如果缺少列,将权重更改为我的索引

我有一个包含不同国家(行)和 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']

有没有办法使这个过程自动化,因为我不确定每个国家的哪一列会有缺失值?


千万里不及你
浏览 128回答 2
2回答

慕码人8056858

您可以np.where为此使用:wa = 0.2*df.A + 0.4*df.B + 0.2*df.Cdf['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.Cdf['new_col'] = np.where(df.isna().any(axis=1), df.mean(axis=1), wa)   A  B    C  new_col0  1  4  7.0      3.21  2  5  8.0      4.02  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_av0  1  4  7.0      3.2     False  3.80          3.21  2  5  8.0      4.0     False  4.75          4.02  3  6  NaN      4.5      True  4.50          NaN

烙印99

我正要写与 yatu基本相同的答案,但试图提高效率。import pandas as pdimport numpy as npdf = 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 = 5000df = pd.DataFrame({"A":np.random.rand(n),                   "B": np.random.rand(n),                   "C":np.random.rand(n),                   "D":np.random.rand(n)})%%timeitwa = 0.2*df.A + 0.4*df.B + 0.2*df.C + 0.2* df.D735 µs ± 19.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)%%timeitwa = np.dot(df.values, weights)18.9 µs ± 732 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python