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

попробуй:

df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)


можно использовать 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']