Pandas DataFrame: заменить все значения в столбце в зависимости от условия

132

У меня есть простой DataFrame, подобный следующему:

Фрейм данных Pandas

Я хочу выбрать все значения в столбце «Первый сезон» и заменить те, которые превышают 1990 год, на 1. В этом примере только у Baltimore Ravens значение 1996 года будет заменено на 1 (оставив остальные данные без изменений).

Я использовал следующее:

df.loc[(df['First Season'] > 1990)] = 1

Но он заменяет все значения в этой строке на 1, а не только значения в столбце «Первый сезон».

Как я могу заменить только значения из этого столбца?

ichimok
источник

Ответы:

226

Вам нужно выбрать этот столбец:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

Итак, синтаксис здесь:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Вы можете проверить документацию, а также 10 минут до панд, которые показывают семантику

РЕДАКТИРОВАТЬ

Если вы хотите сгенерировать логический индикатор, вы можете просто использовать логическое условие для генерации логической серии и привести dtype к intэтому, чтобы преобразовать Trueи Falseв 1и 0соответственно:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003
EdChum
источник
40

Немного поздно на вечеринку, но все же - я предпочитаю использовать numpy where:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])
Амир Ф
источник
2
Я искал решение для условной перезаписи значений столбца, но на основе значения другого столбца, например: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Это было решение.
user582175 06
Я пытаюсь сделать это для нескольких таких условий, но продолжаю получать ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). То, что я пытаюсь сделать, в основном df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. У кого-нибудь есть идеи по этому поводу?
M.Schalk
6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

странно, что ни у кого нет этого ответа, единственная недостающая часть вашего кода - это ['First Season'] сразу после df и просто удалите фигурные скобки внутри.

ODZ
источник
Это дает «SettingWithCopyWarning:». Лучше использовать .loc для всего, как в ответе EdChum.
ambitiousdonut
2

для одного условия, т.е. ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

использовать это:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

поэтому синтаксис здесь:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Для нескольких условий, т.е. (df['employrate'] <=55) & (df['employrate'] > 50)

использовать это:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

поэтому синтаксис здесь:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])
Харшит Джайн
источник
0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Объяснение:

df.locпринимает два аргумента: «индекс строки» и «индекс столбца». Мы проверяем, превышает ли значение 27 значение каждой строки в столбце «Первый сезон», а затем заменяем его на 1.

Абдулла Шафи
источник