Как вычесть значение из столбца на основе другого значения в фрейме данных pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть следующий фрейм данных:

 import pandas as pd
data = [['tom', 10,2,'c',6], ['tom',16 ,3,'a',8], ['tom', 22,2,'a',10],['matt', 10,1,'c',11]]

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Col a','Col c','Category', 'Value']) 
df
  

введите описание изображения здесь

Как я могу настроить новый столбец с именем Calculation where в зависимости от Category того, какой столбец будет использоваться при вычислении?

Например, если Category=='a' тогда я хотел бы, чтобы вычисление было df['Value'] - df['Col a']

Мой ожидаемый результат должен быть:

     Name    Col a   Col c   Category    Value   Calculation
0   tom      10       2          c      6            4
1   tom      16       3          a      8           -8
2   tom      22       2          a      10          -12
3   matt     10       1          c      11           10
  

У меня много разных столбцов, поэтому (возможно, 10 возможных вычислений, поэтому я рад их жестко закодировать)

Любая помощь по этому вопросу будет высоко оценена!

Ответ №1:

Вы можете использовать DataFrame.lookup для получения значений из столбцов на основе соответствующих категорий, а затем вычесть их из столбца Value :

 df['Calc'] = df['Value'] - df.lookup(df.index, df['Category'].radd('Col '))
  

    Name  Col a  Col c Category  Value  Calc
0   tom     10      2        c      6     4
1   tom     16      3        a      8    -8
2   tom     22      2        a     10   -12
3  matt     10      1        c     11    10
  

Комментарии:

1. Спасибо! будет ли это работать, если имена столбцов отличаются от Category значения?

2. @SOK Не могли бы вы привести пример?

3. Если значение Category было ‘z’, но его имя столбца называлось ‘Z Column’, тогда оно не соответствовало бы правильно. Итак, есть ли способ жесткого кода? будет ли словарь лучшим способом и вставьте его вместо radd('Col ')

4. Для работы поиска должно быть соответствие между именами.. Таким образом, в этом случае вы можете использовать Series.map для сопоставления имен столбцов с категорией like df['Category'].map({'a': 'Col a', 'b': 'Col b', 'c': 'Col c', 'z': 'z Column'}) вместо .radd