#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
для сопоставления имен столбцов с категорией likedf['Category'].map({'a': 'Col a', 'b': 'Col b', 'c': 'Col c', 'z': 'z Column'})
вместо.radd