Pandas / Python: установка значения одного столбца на основе значения в другом столбце
Мне нужно установить значение одного столбца на основе значения другого в фрейме данных Pandas. Это логика:
if df['c1'] == 'Value':
df['c2'] = 10
else:
df['c2'] = df['c3']
Я не могу заставить это сделать то, что я хочу, а именно просто создать столбец с новыми значениями (или изменить значение существующего столбца: любой из них работает для меня).
Если я попытаюсь выполнить приведенный выше код или напишу его как функцию и использую метод apply, то получу следующее:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
4 ответов:
Один из способов сделать это-использовать индексацию с помощью
.loc.Пример
В отсутствие примера фрейма данных я приведу его здесь:
import numpy as np import pandas as pd df = pd.DataFrame({'c1': list('abcdefg')}) df.loc[5, 'c1'] = 'Value' >>> df c1 0 a 1 b 2 c 3 d 4 e 5 Value 6 gПредполагая, что вы хотите создать новый столбец
c2, эквивалентноc1, за исключением того, чтоc1являетсяValue, и в этом случае вы хотели бы присвоить ему значение 10:Во-первых, вы можете создать новый столбец
c2и установить его эквивалентнымc1, используя одну из следующих двух строк (они по существу, делать то же самое):df = df.assign(c2 = df['c1']) # OR: df['c2'] = df['c1']Затем найдите все индексы, где
c1равно'Value', используя.loc, и назначьте нужное значение вc2по этим индексам:df.loc[df['c1'] == 'Value', 'c2'] = 10И вы заканчиваете так:
>>> df c1 c2 0 a a 1 b b 2 c c 3 d d 4 e e 5 Value 10 6 g gЕсли, как вы предположили в своем вопросе, вы, возможно, иногда просто захотите заменить значения в столбце, который у вас уже есть, а не создавать новый столбец, то просто пропустите создание столбца и выполните следующие действия. следующее:
df['c1'].loc[df['c1'] == 'Value'] = 10Даю вам:
>>> df c1 0 a 1 b 2 c 3 d 4 e 5 10 6 g
Вы можете использовать
np.where()устанавливать значения на основе кодирования#df c1 c2 c3 0 4 2 1 1 8 7 9 2 1 5 8 3 3 3 5 4 3 6 8Теперь измените значения (или установите) в столбце
['c2']в зависимости от вашего состояния.df['c2'] = np.where(df.c1 == 8,'X',df.c3) c1 c3 c4 0 4 1 1 1 8 9 X 2 1 8 8 3 3 5 5 4 3 8 8
Я предлагаю сделать это в два этапа:
# set fixed value to 'c2' where the condition is met df.loc[df['c1'] == 'Value', 'c2'] = 10 # copy value from 'c3' to 'c2' where the condition is NOT met df.loc[df['c1'] != 'Value', 'c2'] = df[df['c1'] != 'Value', 'c3']
Comments