Pandas 데이터 프레임에서 셀을 NaN으로 설정하는 방법


98

데이터 프레임 열의 잘못된 값을 NaN으로 바꾸고 싶습니다.

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

하지만 마지막 줄은 실패하고 df 사본에서 작동하기 때문에 경고를 던집니다. 그렇다면 이것을 처리하는 올바른 방법은 무엇입니까? iloc 또는 ix로 많은 솔루션을 보았지만 여기서는 부울 조건을 사용해야합니다.


제목이 오해의 소지가있는 것 같습니다. 문제는 데이터 프레임에서 NaN을 원하는 것이 아닙니다. 문제는 "DataFrame의 슬라이스 사본에 설정하려고"한다는 것입니다.
Teepeemm

답변:


123

그냥 사용하십시오 replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

당신이 시도하는 것은 체인 인덱싱이라고합니다 : http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

loc원래 dF에서 작동하는지 확인 하는 데 사용할 수 있습니다 .

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

13

사용 replace하면 문제가 해결되는 것 같지만 대안을 제안하고 싶습니다. 문자열을 np.nan으로 대체하지 않고 전체 열을 적절하게 만드는 열에서 숫자와 일부 문자열 값의 혼합 문제. 원래 열이 객체 유형일 가능성이 가장 높을 것입니다.

Name: y, dtype: object

정말로 필요한 것은 모든 비 숫자 값이 NaN으로 대체 된 숫자 열 (올바른 유형을 가지며 훨씬 빠름)으로 만드는 것입니다.

따라서 좋은 전환 코드는

pd.to_numeric(df['y'], errors='coerce')

errors='coerce'숫자 값으로 구문 분석 할 수없는 문자열이 NaN이되도록 지정 합니다. 열 유형은

Name: y, dtype: float64

10

교체를 사용할 수 있습니다.

df['y'] = df['y'].replace({'N/A': np.nan})

에 대한 inplace매개 변수 도 알고 있어야 합니다 replace. 다음과 같이 할 수 있습니다.

df.replace({'N/A': np.nan}, inplace=True)

복사본을 만들지 않고 df의 모든 인스턴스를 대체합니다.

마찬가지로 빈 문자열 또는 없음 값과 같은 다른 유형의 알 수없는 값이있는 경우 :

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

참조 : 최신 판다-교체


2

Pandas 1.0.0부터는 더 이상 numpy를 사용하여 데이터 프레임에서 null 값을 만들 필요가 없습니다. 대신 pandas.NA (pandas._libs.missing.NAType 유형)를 사용할 수 있으므로 데이터 프레임 내에서는 null로 처리되지만 데이터 프레임 컨텍스트 외부에서는 null이 아닙니다.


이것은 OP의 문제를 해결하지 못하지만 실제로 제목의 질문에 대답했기 때문에 나는 투표했습니다.
Teepeemm

1
df.loc[df.y == 'N/A',['y']] = np.nan

이것은 당신의 문제를 해결합니다. double []을 사용하면 DataFrame의 복사본에서 작업하고 있습니다. 수정하려면 한 번의 호출에서 정확한 위치를 지정해야합니다.


0

이 스 니펫을 사용해 볼 수 있습니다.

In [16] : mydata = { 'x': [10, 50, 18, 32, 47, 20], 'y': [ '12', '11', 'N / A', '13', ' 15 ','해당 없음 ']}
[17] : df = pd.DataFrame (mydata)에서

[18] : df.y [df.y == "N / A"] = np.nan

출력 [19] : df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

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