Создать новый столбец (столбцы) из существующих столбцов, где входной файл указывает, какие столбцы создавать / использовать - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть panda dataframe, который содержит мультииндекс и несколько столбцов.

Я хочу добавить новые столбцы в этот dataframe, сложив (вычтя) вместе 2 или более существующих столбцов в dataframe.

Что такое имена новых столбцов, какие столбцы следует использовать, и нужно ли их добавлять или вычитать, задается в отдельном входном файле csv.

Например:

my исходный фрейм данных :

                 col1  col2   col3   col4
index1  index2
  A       X       10    100    50     20
  B       X       10    200    50     20
  C       X       10    300    50     20

инструкция столбца csv / dataframe

                       Factor
newCol      existingCol
  newCol1       col1     1
  newCol1       col2     1
  newCol2       col2     1
  newCol2       col3    -1
  newCol2       col4    -1

Этот файл говорит о создании 2 новых столбцов с именами newCol1 и newCol2. Чтобы сделать newCol1, добавьте данные в col1 и col2. Чтобы сделать newCol2, возьмите данные в col2 и вычтите col3 и col4.

Чистый результирующий кадр данных должен выглядеть следующим образом:

                 col1  col2   col3   col4  newCol1  newCol2
index1  index2
  A       X       10    100    50     20    110       30
  B       X       10    200    50     20    210      130 
  C       X       10    300    50     20    310      230

Я не знаю, прежде чем читать данные и файлы столбцов, как будут называться имена столбцов или как их объединять.

Если dataframe должно быть "deindexed", чтобы сделать это нормально, я всегда могу переиндексировать его снова после добавления новых данных столбца.

Вся помощь приветствуется.

1 Ответ

0 голосов
/ 07 ноября 2018

Вот как я это сделаю:

import pandas as pd
from io import StringIO

s = StringIO('''    index1  index2          col1  col2   col3   col4
  A       X       10    100    50     20
  B       X       10    200    50     20
  C       X       10    300    50     20 
''')


df1 = pd.read_csv(s, sep='\s+')

s = StringIO('''newCol      existingCol                      Factor
  newCol1       col1     1
  newCol1       col2     1
  newCol2       col2     1
  newCol2       col3    -1
  newCol2       col4    -1
''')
df2 = pd.read_csv(s, sep='\s+')

def add_new_cols(df1, df2):
    for new_col in set(df2.newCol):
        df_temp = df2[df2.newCol == new_col]
        df_temp.reset_index(drop=True, inplace=True)

        df1[new_col] = 0
        for row_ind in range(df_temp.shape[0]):
             df1[new_col] += df_temp.loc[row_ind, 'Factor']*df1.loc[:, df_temp.loc[row_ind, 'existingCol']]

        print(df_temp)
        print('___')

add_new_cols(df1, df2)

Изменяет df1 до желаемой формы. Хотя это не самый эффективный способ, но он выполняет свою работу.

Лучшее решение

Сначала создайте строку, представляющую формулу, а затем используйте eval в первом фрейме данных, чтобы применить эту формулу.

# Achieving the same using .eval
for new_col in set(df2.newCol):
    print(new_col)

    df_temp = df2[df2.newCol == new_col]
    df_temp.reset_index(drop=True, inplace=True)

    formula_ = '0'
    for row_ind in range(df_temp.shape[0]):
        if df_temp.loc[row_ind, "Factor"] >= 0:
            formula_ += '+' + f'{df_temp.loc[row_ind, "Factor"]}*{df_temp.loc[row_ind, "existingCol"]}'
        else:
            formula_ +=  f'{df_temp.loc[row_ind, "Factor"]}*{df_temp.loc[row_ind, "existingCol"]}'
    print(formula_)

    df1.eval(f'{new_col}={formula_}', inplace=True)

Желаемый вывод: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...