Pandas DataFrame : 조건에 따라 열의 모든 값을 바꿉니다.


132

다음과 같은 간단한 DataFrame이 있습니다.

Pandas DataFrame

'First Season'열에서 모든 값을 선택하고 1990 년이 넘는 값을 1로 바꾸고 싶습니다.이 예에서 Baltimore Ravens만이 1996 년을 1로 바 꾸었습니다 (나머지 데이터는 그대로 유지).

다음을 사용했습니다.

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

그러나 'First Season'열의 값뿐만 아니라 해당 행의 모든 ​​값을 1로 대체합니다.

해당 열의 값만 어떻게 바꿀 수 있습니까?

답변:


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)> ]

문서 와 의미를 보여주는 pandas까지 10 분을 확인할 수 있습니다.

편집하다

당신은 부울 지표를 생성 할 경우, 당신은 부울 시리즈를 생성하는 부울 조건을 사용하여에 DTYPE 캐스트 할 수 있습니다 int이 변환됩니다 TrueFalse10각각 :

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

40

파티에 조금 늦었지만 여전히 numpy를 사용하는 것을 선호합니다.

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

나는 이와 같은 여러 조건에 대해 이것을 시도하고 있지만 계속 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

아무도이 대답을 가지고 있지 않다는 것이 이상합니다. 코드에서 빠진 부분은 df 바로 뒤에있는 [ 'First Season']이며 내부의 중괄호를 제거하십시오.


그것은 'SettingWithCopyWarning :'을 제공합니다. EdChum의 대답과 같이 전체적으로 .loc을 사용하는 것이 좋습니다.
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로 바꿉니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.