pandas DataFrame : nan 값을 평균 열로 바꿉니다.


177

나는 대부분의 실수로 채워진 팬더 DataFrame을 가지고 있지만 그 안에 몇 가지 nan값이 있습니다.

nans를 열의 평균 열로 바꾸려면 어떻게 해야합니까?

이 질문은이 질문과 매우 유사합니다. numpy 배열 : nan 값을 평균 열로 바꾸지 만 불행히도 팬더 DataFrame에는 해당 솔루션이 작동하지 않습니다.

답변:


273

를 사용 DataFrame.fillna하여를 nan직접 채울 수 있습니다 .

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

의 docstring은 스칼라 또는 dict이어야 fillna한다고 말하지만 value, 함께 작동하는 것 같습니다 Series. dict을 전달하려면을 사용할 수 있습니다 df.mean().to_dict().


10
df.fillna(df.mean())새 데이터 프레임을 반환하므로 df=df.fillna(df.mean())이를 유지하기 위해 작성 해야합니다.
yannis

내가 이것을 사용하는 평균에 대해 잘못된 금액이 전가되는 이유는 무엇입니까?
bernando_vialli

25
대신에 df=df.fillna(df.mean())당신도 사용할 수 있습니다df.fillna(df.mean(), inplace=True)
Anderson Pimentel

20
주의 : 머신 러닝 / 데이터 과학에이 기능을 사용하려면 데이터 과학 관점 에서 먼저 NA를 교체 한 다음 기차와 테스트로 분할 하는 것이 잘못 되었습니다. 먼저 기차와 테스트로 분할 한 다음 NA를 훈련을 한 다음이 상태 저장 전처리 모델을 적용하여 테스트하십시오. 아래 sklearn 관련 답변을 참조하십시오!
Fabian Werner '

2
그렇지 않으면 테스트 세트에서 교육 세트로 정보를 유출하기 때문에 @ amalik2205! 다음과 같이 상상해보십시오. 100 개의 데이터 행이 있고 x 열을 고려합니다. x의 처음 99 개 항목은 NA입니다. 100 행을 테스트 세트로 분리하려고합니다. 열 100에 행 100의 값이 20이라고 가정합니다. 그런 다음 x 열의 학습 세트에있는 모든 항목을 20으로 대체합니다.이 값은 테스트 세트에서 100 %입니다. 따라서 평가가 당신을 속일 수 있습니다!
Fabian Werner


28
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

해당 열의 평균을 열별로 적용하고 채 웁니다.

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

5
왜 그런지 모르겠지만 df.fillna (df.mean ())가 작동하지 않았고 적용 가능한 버전 만 적용되었습니다. Python 3
Rocketq

12
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

훨씬 간단한 대안에 비해이 모든 것의 장점은 무엇입니까?
AMC

@Roshan Jha 항상 논리를 설명하는 것이 좋습니다. R & Python에서 동일한 작업을 수행하는 방법에는 여러 가지가 있습니다. 그러나 당신이 다른 것을 제안한다면, 당신은 그렇게하는 것에 대한 몇 가지 advanatages를 지적하고 싶을 수도 있습니다
Dr. Nisha Arora

10

누락 된 값을 평균으로 대치하고 열별로 이동하려는 경우 해당 열의 평균 만 대치합니다. 좀 더 읽기 쉽습니다.

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

3
이것이 어떻게 문제를 해결하는지에 대한 설명을 제공해주십시오.
Gurwinder Singh

10

df.fillna(df.mean())모든 null 값을 평균으로 채우는 데 직접 사용

해당 열의 평균으로 null 값을 채우려면 이것을 사용할 수 있습니다

x=df['Item_Weight']여기 Item_Weight에 열 이름이 있다고 가정 하십시오.

여기서 우리는 할당하고 있습니다 (x의 x로 null 값을 x에 채 웁니다)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

일부 문자열로 null 값을 채우려면

여기는 Outlet_size열 이름입니다

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

9

위의 옵션 외에 다른 옵션은 다음과 같습니다.

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

평균적으로 이전 응답보다 우아하지는 않지만 null을 다른 열 함수로 바꾸려는 경우 더 짧을 수 있습니다.


7

팬더 : NaN ( nan) 값을 평균 (평균), 중앙값 또는 한 열의 다른 통계 로 바꾸는 방법

DataFrame이 df있고라는 열이 하나 있다고 가정하십시오 nr_items. 이것은: df['nr_items']

당신이 할 경우 대체NaN 당신의 열의 값 df['nr_items']컬럼의 평균을 :

사용 방법 .fillna():

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

값을 열 값으로 대체 하여 새 열을 저장하기 위해 df호출 된 새 열 을 만들었습니다 .nr_item_aveNaNmean

를 사용할 때는주의해야합니다 mean. 당신이있는 경우 이상치 를 사용하는 것이 더 추천 할median


0

sklearn 라이브러리 전처리 클래스 사용

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

참고 : 최신 버전의 매개 변수 missing_valuesnp.nan에서NaN

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