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
, и установите его в эквивалент as 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']