熊猫函数基于字典创建组合列

时间:2019-02-14 13:15:52

标签: python pandas dataframe dictionary

我正在尝试在pandas.DataFrame

中创建一个加权列

我有一个Python dictionary,键为pandas.DataFrame列名,值为相应的权重。

我想创建一个新列,该列根据dictionary并引用pandas.DataFrame列值进行加权。

  

考虑到我的dictionary配置将更改并包含“错误配置”,什么是有效的方法?

例如:

import pandas as pd
import numpy as np
weights = {'IX1' : 0.3, 'IX2' : 0.2, 'IX3' : 0.4, 'IX4' : 0.1}
np.random.seed(0)
df = pd.DataFrame(np.random.randn(10, 3), columns=['IX1', 'IX2', 'IX3'])

##Desired output --- manually combine
df['Composite'] = df['IX1']*0.3 + df['IX2']*0.2 + df['IX3']*0.4

即使pandas.DataFrame缺少列,我也希望代码仍然运行

1 个答案:

答案 0 :(得分:4)

首先通过Index.intersection为字典中的列和键创建相同值的变量,然后选择此列,并使用仅针对相同列过滤的dict与dotSeries进行矩阵乘法:

df['Composite'] = df['IX1']*0.3 + df['IX2']*0.2 + df['IX3']*0.4

cols = df.columns.intersection(weights.keys())
df['Composite1'] = df[cols].dot(pd.Series(weights)[cols])
print (df)
        IX1       IX2       IX3  Composite  Composite1
0  1.764052  0.400157  0.978738   1.000742    1.000742
1  2.240893  1.867558 -0.977278   0.654868    0.654868
2  0.950088 -0.151357 -0.103219   0.213468    0.213468
3  0.410599  0.144044  1.454274   0.733698    0.733698
4  0.761038  0.121675  0.443863   0.430192    0.430192
5  0.333674  1.494079 -0.205158   0.316855    0.316855
6  0.313068 -0.854096 -2.552990  -1.098095   -1.098095
7  0.653619  0.864436 -0.742165   0.072107    0.072107
8  2.269755 -1.454366  0.045759   0.408357    0.408357
9 -0.187184  1.532779  1.469359   0.838144    0.838144