DataFrame do Pandas: substitua todos os valores em uma coluna, com base na condição

132

Eu tenho um DataFrame simples como o seguinte:

Pandas DataFrame

Quero selecionar todos os valores da coluna 'Primeira Temporada' e substituir os que estão acima de 1990 por 1. Nesse exemplo, apenas o Baltimore Ravens teria o 1996 substituído por 1 (mantendo o restante dos dados intactos).

Eu usei o seguinte:

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

Porém, ele substitui todos os valores dessa linha por 1, e não apenas os valores da coluna 'Primeira temporada'.

Como posso substituir apenas os valores dessa coluna?

ichimok
fonte

Respostas:

226

Você precisa selecionar essa coluna:

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

Portanto, a sintaxe aqui é:

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

Você pode verificar os documentos e também os 10 minutos para os pandas, que mostram a semântica

EDITAR

Se você deseja gerar um indicador booleano, basta usar a condição booleana para gerar uma série booleana e converter o dtype para que inteste converta Truee Falsepara 1e 0respectivamente:

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
fonte
40

Um pouco atrasado para a festa, mas ainda assim - prefiro usar numpy onde:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])
Amir F
fonte
2
Eu estava procurando uma solução para substituir valores de coluna condicionalmente, mas com base no valor de outra coluna, como este: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Esta foi a solução para isso.
user582175
Estou tentando fazer isso para várias condições como essa, mas continuo recebendo ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). O que estou tentando fazer é basicamente df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Alguém tem uma idéia sobre isso?
M.Schalk 03/02
5
df['First Season'].loc[(df['First Season'] > 1990)] = 1

estranho que ninguém tenha essa resposta, a única parte que falta no seu código é a ['Primeira Temporada'] logo após o df e apenas remova seus colchetes dentro.

Odz
fonte
Isso fornece um 'SettingWithCopyWarning:' É melhor usar .loc para a coisa toda, como na resposta de EdChum.
ambitiousdonut
2

para condição única, ie. ( '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

usa isto:

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

portanto, sintaxe aqui é:

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

Para várias condições, ie. (df['employrate'] <=55) & (df['employrate'] > 50)

usa isto:

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

portanto, sintaxe aqui é:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])
Harshit Jain
fonte
0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Explicação:

df.locrecebe dois argumentos, 'índice de linha' e 'índice de coluna'. Estamos verificando se o valor é maior que 27 de cada valor da linha, na coluna "Primeira temporada" e substituindo-o por 1.

Abdullah shafi
fonte