функция панд для создания комбинированного столбца на основе dict - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать взвешенный столбец в pandas.DataFrame

У меня есть питон 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 голосов
/ 14 февраля 2019

Сначала создайте переменную для тех же значений для столбцов и ключей в словаре с помощью Index.intersection, затем выберите эти столбцы и используйте матричное умножение с dot с Series из dictфильтруется только для тех же столбцов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...