[英]Pythonic way to get a weighted sum using a DataFrame and dict
给定一个 DataFrame 和一个 Dict,我怎样才能得到一个带有加权总和的新列? Dict 中的键与 DataFrame 中的列名匹配
import pandas as pd
df = pd.DataFrame({'Index': ['aaa', 'bbb', 'ccc'],
'a': [1, 2, 3],
'b': [4, 5, 6],
'c': [7, 8, 9]})
df.set_index('Index', inplace=True)
weights = {'a': 0.5,
'b': 0.2
}
在这里,我想要一个 pythonic 方式(我目前正在做一个大循环!)来获得以下结果:
| Index | a | b | c | weighted_sum |
| aaa | 1 | 4 | 7 | (1 * 0.5) + (4 * 0.2) |
| bbb | 2 | 5 | 8 | (2 * 0.5) + (5 * 0.2) |
| ccc | 3 | 6 | 9 | (3 * 0.5) + (6 * 0.2) |
注意,我不会总是知道权重字典中的键是什么
你可以做:
df['weighted_sum'] = df[['a','b']].mul(weights).sum(1)
或等效地:
df['weighted_sum'] = (df[['a','b']] * weights).sum(1)
输出:
a b c weighted_sum
Index
aaa 1 4 7 1.3
bbb 2 5 8 2.0
ccc 3 6 9 2.7
现在,如果您并不总是知道密钥,则可以使用weights.keys()
获取密钥:
(df[weights.keys()] * weights).sum(1)
如果您的键不在数据框的列中,则可能会引发KeyError
。 在这种情况下,您可以将weights
变成一个系列,Pandas 将为您完成繁重的工作。
df.mul(pd.Series(weights)).sum(1)
您可以使用.assign
然后.mul
和.sum
(不要使用dict
作为变量名)
import pandas as pd
df = pd.DataFrame({'Index': ['aaa', 'bbb', 'ccc'],
'a': [1, 2, 3],
'b': [4, 5, 6],
'c': [7, 8, 9]})
df.set_index('Index', inplace=True)
pdict = {'a': 0.5,
'b': 0.2
}
df = df.assign(**pdict).mul(df)[['a','b']].sum(1)
print(df)
一个简单的方法就是这样
def funk(df,d):
return df[list(d)[0]]*d[list(d)[0]] + df[list(d)[1]]*d[list(d)[1]]
funk(df,d)
结果
aaa 1.3
bbb 2.0
ccc 2.7
dtype: float64
我的单行版本看起来像:
df['weighted_sum'] = sum([df[key] * weights[key] for key in weights.keys()])
打印结果在
a b c weighted_sum
Index
aaa 1 4 7 1.3
bbb 2 5 8 2.0
ccc 3 6 9 2.7
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.