繁体   English   中英

使用 DataFrame 和 dict 获得加权总和的 Pythonic 方法

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM