programing

panda Data Frame: nan 값을 평균 컬럼으로 대체

javaba 2022. 10. 26. 21:16
반응형

panda Data Frame: nan 값을 평균 컬럼으로 대체

데이터 프레임은 대부분 실제 수치로 채워져 있지만nan그 안에 가치도 있습니다.

의 교환 방법nan평균 열과 함께 s가 있습니까?

이 질문은 다음과 같습니다. numpy array: nan 값을 평균 컬럼으로 대체하지만 안타깝게도 이 솔루션은 팬더 Data Frame에는 적용되지 않습니다.

를 사용하여 다음 항목을 채울 수 있습니다.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

의 docstringfillna라고 한다valuescalar 또는 dict여야 합니다만, 이것은 scalar 또는 dict와 함께 동작하는 것처럼 보입니다.Series뿐만 아니라.딕트를 전달하고 싶다면df.mean().to_dict().

시험:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)
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

아래 코드는 작동하지만 # 레코드가 100k 이상인 DataFrame을 처리할 때 성능이 크게 저하됩니다.

df.fillna(df.mean())

지금까지의 경험으로는 데이터 프레임 전체에 fillna()를 적용하는 것이 아니라 필요한 경우에만 NaN 값(평균값 또는 중위수)을 교체해야 합니다.

20개의 변수를 가진 Data Frame을 사용했는데, 그 중 4개만 NaN 값 처리(교환)를 필요로 했습니다.의 코드(코드 1)를 약간 수정된 버전(코드 2)과 함께 사용해 보았습니다.여기서 NaN 값을 가진 변수만 선택적으로 실행했습니다.

#------------------------------------------------
#----(Code 1) Treatment on overall DataFrame-----

df.fillna(df.mean())

#------------------------------------------------
#----(Code 2) Selective Treatment----------------

for i in df.columns[df.isnull().any(axis=0)]:     #---Applying Only on variables with NaN values
    df[i].fillna(df[i].mean(),inplace=True)

#---df.isnull().any(axis=0) gives True/False flag (Boolean value series), 
#---which when applied on df.columns[], helps identify variables with NaN values

Data Frame에서 레코드 수를 계속 늘려가면서 관찰한 성능은 다음과 같습니다.

최대 10만 레코드의 데이터 프레임

  • 코드 1: 22.06초
  • 코드 2: 0.03초

최대 20만 레코드의 데이터 프레임

  • 코드 1: 180.06초
  • 코드 2: 0.06초

최대 160만 개의 레코드를 보유한 데이터 프레임

  • 코드 1: 코드가 끝없이 계속 실행
  • 코드 2: 0.40초

최대 1,300만 개의 레코드를 보유한 데이터 프레임

  • 코드 1: -- 시도조차 하지 않았습니다.1.6 Mn 레코드의 퍼포먼스를 확인한 후--
  • 코드 2: 3.20초

답변이 길어서 죄송합니다! 이것이 도움이 되길 바랍니다!

결측값을 평균을 사용하여 귀속시키고 열 단위로 이동하려는 경우 이 값은 해당 열의 평균으로만 귀속됩니다.이게 좀 더 읽기 쉬울 수도 있어요.

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
# 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])

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

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

가정하다x=df['Item_Weight'](여기서)Item_Weight column is 열 。

여기서 할당한다(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')

NaN을 (★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」nan의 컬럼의 또는 입니다.

이 「」라고 합니다.df '은 하나밖에 요'라는 칼럼이 있어요.nr_items 됩니다.df['nr_items']

열 값을 바꾸려는 경우df['nr_items']열의 평균을 사용하여:

사용방법:

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

나는 새로운 것을 창조했다.df이라고 하는 칼럼이라는 열nr_item_ave NaN「」로 값.mean컬럼의 값

.mean특이치가 있는 경우 다음을 사용하는 것이 좋습니다.

상기 이외의 옵션은 다음과 같습니다.

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

평균에 대한 이전 반응보다 덜 우아하지만 Null을 다른 열 함수로 대체하려는 경우에는 더 짧을 수 있습니다.

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_values value change to 로의 변화를 중시하다np.nan부에서NaN

이 방법을 사용하여 결측값을 열의 평균으로 채웁니다.

fill_mean = lambda col : col.fillna(col.mean())

df = df.apply(fill_mean, axis = 0)

You can also use 를 사용할 수도 있습니다.value_counts가장 자주 값을 받다가장 빈번한 값을 얻을 수 있습니다.이것은 다른 데이터 유형으로 일할 것입니다.이것은, 다른 데이터 타입으로 동작합니다.

df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))

다음은 value_counts API 참조입니다.

언급URL : https://stackoverflow.com/questions/18689823/pandas-dataframe-replace-nan-values-with-average-of-columns

반응형