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
라고 한다value
scalar 또는 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
'programing' 카테고리의 다른 글
기존 스트림에 새로운 가치 추가 (0) | 2022.10.26 |
---|---|
JavaScript에서 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까? (0) | 2022.10.26 |
8자의 UUID 가져오기 (0) | 2022.10.26 |
vue.js의 데이터 변경에 대응하여 비동기식 또는 고비용 작업을 수행하는 데 워처가 계산보다 나은 이유는 무엇입니까? (0) | 2022.10.07 |
마리아DB가 훨씬 빨라졌는데 원인을 찾을 수 없다고요? (0) | 2022.10.07 |