팬더 데이터 프레임의 열에서 모든 NaN 값을 0으로 바꾸는 방법


457

아래와 같이 데이터 프레임이 있습니다

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN

금액 열에 함수를 적용하려고하면 다음 오류가 발생합니다.

ValueError: cannot convert float NaN to integer

나는 수학 모듈에서 .isnan을 사용하여 함수를 적용하려고 시도했습니다. 팬더 .replace 속성을 시도했습니다. 팬더 0.9에서 .sparse 데이터 속성을 시도했습니다. 나 함수에 NaN == NaN 문이 있으면 시도했습니다. 이 기사를 보았습니다 .R 데이터 프레임에서 NA 값을 0으로 바꾸는 방법은 무엇입니까? 다른 기사를 보면서. 내가 시도한 모든 방법이 작동하지 않거나 NaN을 인식하지 못합니다. 모든 힌트 또는 솔루션을 주시면 감사하겠습니다.


유일한 문제는 당신이 그것을 적용되는 데이터 프레임이 재 샘플링 또는 LOC 기능을 통해 슬라이스 된 경우 df.fill.na ()가 작동하지 않습니다이다
왕자 아가 왈를

답변:


754

나는 DataFrame.fillna()당신을 위해 이것을 할 것이라고 믿습니다 .

에 대한 문서 링크 dataframe 및 대한 시리즈 .

예:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

한 열에 만 NaN을 채우려면 해당 열만 선택하십시오. 이 경우 inplace = True를 사용하여 실제로 df의 내용을 변경합니다.

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000

편집하다:

를 피하려면 SettingWithCopyWarning내장 된 열별 기능을 사용하십시오.

df.fillna({1:0}, inplace=True)

1
df[1]원본 DF의 사본이 아니라보기라는 보장이 있습니까? 복제 본인 드문 상황이 발생하면 매우 문제가되는 버그가 발생할 수 있습니다. 팬더 문서에 명확한 설명이 있습니까?
최대

@max 이것을보고, 질문을 해결할 수 있습니다 : stackoverflow.com/questions/23296282/…
Aman

감사. 그 대답에서 "설정하는 인덱서"가 가장 바깥 쪽의 인덱싱 작업 (지정 직전에 실행 됨)이라는 것을 이해하고 있습니까? 따라서 단일 인덱서를 사용하는 모든 지정이 안전하다는 것이 보장되어 코드가 안전합니까?
max

1
왜 이것이 작동하지 않습니까? 참조 : stackoverflow.com/questions/39452095/how-to-fillna-with-value-0
표시 이름

1
마지막 예제는 SettingWithCopyWarning을 던졌습니다
Sip

124

슬라이싱이 뷰 또는 사본을 반환한다고 보장 할 수는 없습니다. 넌 할 수있어

df['column'] = df['column'].fillna(value)

14
"inplace = True"문제를 발견했습니다. 이 답변은 문제를 피하고 가장 깨끗한 해결책이라고 생각합니다.
TimCera

48

다음 replace으로 변경하는 NaN데 사용할 수 있습니다 0.

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)

교체 만 NaN됩니까? 또는 그것은 어디 NA에서나 NaN같은 가치를 대체 할 df.fillna(0)것인가? 나는 존재 NaN하지 않는 가치만을 대체하는 솔루션을 찾고 있습니다NA
Shyam Bhimani

1
@ShyamBhimani NaN즉, np.isnanTrue 인 값만 대체해야합니다
Anton Protopopov

23

사람들이 여전히 여기에 오는 것처럼 보이기 때문에 약간의 업데이트 / 특수 사례를 제공하고 싶었습니다. 다중 색인을 사용하거나 색인 슬라이서를 사용하는 경우 inplace = True 옵션이 선택한 슬라이스를 업데이트하기에 충분하지 않을 수 있습니다. 예를 들어 2x2 수준의 다중 인덱스에서는 값이 변경되지 않습니다 (팬더 0.15 기준).

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

"문제"는 연결로 인해 원래 데이터 프레임을 업데이트하는 채우기 기능이 중단된다는 것입니다. 특정 상황에서 이러한 체인을 통해 해석하지 못한 디자인 결정의 이유가 있기 때문에 "문제"를 따옴표로 묶었습니다. 또한 이것은 복잡한 예이지만 (실제로 실행되었지만) 슬라이스 방법에 따라 더 적은 수준의 인덱스에도 동일하게 적용될 수 있습니다.

해결책은 DataFrame.update입니다.

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

그것은 한 줄이며, 합리적으로 잘 읽으며 (중간에) 중간 변수 또는 루프로 불필요한 혼란을 제거하면서 원하는 멀티 레벨 슬라이스에 필 나를 적용 할 수 있습니다!

아무도 이것이 작동하지 않는 장소를 찾을 수 있다면 의견에 게시하십시오. 나는 그것을 엉망으로 만들고 소스를 보았으며 적어도 다중 인덱스 슬라이스 문제를 해결하는 것으로 보입니다.


21

아래 코드는 저에게 효과적이었습니다.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)

7

결 측값을 채우는 쉬운 방법 :-

문자열 열 채우기 : 문자열 열에 누락 된 값과 NaN 값이있는 경우

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

숫자 열 채우기 : 숫자 열에 결 측값과 NaN 값이있는 경우.

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

NaN을 0으로 채우는 것 :

df['column name'].fillna(0, inplace = True)

5

사전을 사용하여 모든 DF를 일부 oneValue로 채우는 대신 DataFrame에서 특정 열의 NaN 값을 채울 수 있습니다.

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)

이것이 OP의 질문에 대한 개발자가 의도 한 솔루션입니다.
johnDanger

4

여기에 이미지 설명을 입력하십시오

Amount위 표의 특정 열 을 고려하면 정수 유형입니다. 다음은 해결책입니다.

df['Amount'] = df.Amount.fillna(0).astype(int)

마찬가지로 같은 다양한 데이터 형식을 채울 수 float, str등등.

특히 동일한 열의 다양한 값을 비교하기 위해 데이터 유형을 고려할 것입니다.


2

팬더에서 na 값을 바꾸려면

df['column_name'].fillna(value_to_be_replaced,inplace=True)

인 경우 inplace = Falsedf (데이터 프레임)를 업데이트하는 대신 수정 된 값을 반환합니다.


1

이 데이터를 팬더 데이터 프레임으로 변환 한 경우을 사용하여이 작업을 수행 할 수도 있습니다 fillna.

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

이것은 다음을 반환합니다 :

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0

1

주로 사용 가능한 두 가지 옵션이 있습니다. 대치 또는 결손 값 NaN / np.nan 이 수치로만 대체되는 경우 ( 열간 ) :

df['Amount'].fillna(value=None, method= ,axis=1,) 충분하다:

설명서에서 :

value : 스칼라, dict, Series 또는 DataFrame 홀 (예 : 0)을 채우는 데 사용할 값, 또는 각 인덱스 (Series) 또는 열 (DataFrame)에 사용할 값을 지정하는 dict / Series / DataFrame 값 . (dict / Series / DataFrame에없는 값은 채워지지 않습니다). 이 값은 목록이 될 수 없습니다.

이는 '문자열'또는 '상수'가 더 이상 대치 될 수 없음을 의미합니다.

보다 전문화 된 대치의 경우 SimpleImputer ()를 사용 하십시오 .

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

0

다른 열의 nan을 다른 방법으로 바꾸려면 :

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.