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

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

      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을 인식하지 못합니다. 모든 힌트 또는 솔루션을 주시면 감사하겠습니다.



답변

나는 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)


답변

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

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


답변

다음 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)


답변

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

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

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


답변

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

import pandas

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

df = df.fillna(0)


답변

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

문자열 열 채우기 : 문자열 열에 누락 된 값과 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)


답변

사전을 사용하여 모든 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)