Pandas DataFrame에서 잘못된 값을 없음으로 바꿉니다.
값을 다음과 같이 대체할 방법이 있습니까?None
팬더 인 파이썬?
사용가능df.replace('pre', 'post')
값을 다른 값으로 바꿀 수는 있지만, 만약 당신이 다음 값으로 바꾸고 싶다면, 이것은 할 수 없습니다.None
당신이 노력하면 이상한 결과를 얻을 수 있는 가치.
예를 들어 보겠습니다.
df = DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df.replace('-', 0)
성공적인 결과를 반환합니다.
그렇지만,
df.replace('-', None)
다음 결과를 반환합니다.
0
0 - // this isn't replaced
1 3
2 2
3 5
4 1
5 -5
6 -1
7 -1 // this is changed to `-1`...
8 9
왜 그런 이상한 결과가 돌아오는 거지?
이 데이터 프레임을 MySQL 데이터베이스에 쏟아붓고 싶어서 입력할 수 없습니다.NaN
값을 내 데이터 프레임의 모든 요소에 입력하고 대신 입력하기를 원합니다.None
. 물론이죠, 먼저 바꿀 수 있습니다.'-'
로.NaN
그 다음에 변환합니다.NaN
로.None
, 데이터 프레임이 왜 그렇게 끔찍한 방식으로 작동하는지 알고 싶습니다.
Python 2.7 및 OS X 10.8에서 Panda 0.12.0 dev를 테스트했습니다.참고로 파이썬은 OS X에 사전 설치된 버전으로 SciPy Superpack 스크립트를 이용하여 팬더를 설치하였습니다.
실제로 이후 버전의 팬더에서는 TypeError가 발생합니다.
df.replace('-', None)
TypeError: If "to_replace" and "value" are both None then regex must be a mapping
목록이나 사전을 전달하면 가능합니다.
In [11]: df.replace('-', df.replace(['-'], [None]) # or .replace('-', {0: None})
Out[11]:
0
0 None
1 3
2 2
3 5
4 1
5 -5
6 -1
7 None
8 9
하지만 없음 대신 NaN을 사용하는 것이 좋습니다.
In [12]: df.replace('-', np.nan)
Out[12]:
0
0 NaN
1 3
2 2
3 5
4 1
5 -5
6 -1
7 NaN
8 9
저는 a와 함께 사용하는 솔루션을 선호합니다.dict
그 단순함과 우아함 때문에:
df.replace({'-': None})
다음과 같은 교체 작업을 더 할 수도 있습니다.
df.replace({'-': None, 'None': None})
그리고 더 큰 규모의 교체라 할지라도, 무엇이 무엇으로 대체되는지는 항상 분명하고 명확하며, 그것은 긴 목록에서 훨씬 더 어려운 것입니다.
where
아마 당신이 찾으시는 물건일 겁니다
data=data.where(data=='-', None)
팬더 문서에서:
where
[반환] self와 모양이 같고 해당 항목이 self(컨드가 True이고 다른 항목이 아닌 경우 self)에서 온 개체입니다.
이 게시물을 진행하기 전에 NaN과 None의 차이점을 이해하는 것이 중요합니다.하나는 플로트 타입이고 다른 하나는 오브젝트 타입입니다.팬더는 스칼라 유형에 대한 많은 방법이 벡터화될 수 있기 때문에 스칼라 유형으로 작업하는 데 더 적합합니다.판다는 None과 NaN을 일관성 있게 다루려고 노력하지만 NumPy는 그렇게 할 수 없습니다.
하지만 당신의 질문에 대답하자면...
팬더 >= 0.18: 사용na_values=['-']
와의 논쟁read_csv
CSV/Excel에서 이 데이터를 로드하셨다면 좋은 소식이 있습니다.다음 단계로 코드를 사용하여 수정사항을 작성하는 대신 데이터를 로드하는 동안 이를 루트에서 해제할 수 있습니다.
의 pd.read_*
함수(및 등)는 속성을 허용합니다.
file.csv
A,B
-,1
3,-
2,-
5,3
1,-2
-5,4
-1,-1
-,0
9,0
이제 하기, 를 .-
Do NaNs두,에,
import pandas as pd
df = pd.read_csv('file.csv', na_values=['-'])
df
A B
0 NaN 1.0
1 3.0 NaN
2 2.0 NaN
3 5.0 3.0
4 1.0 -2.0
5 -5.0 4.0
6 -1.0 -1.0
7 NaN 0.0
8 9.0 0.0
그리고 다른 기능/파일 형식에서도 유사합니다.
추신: v0.24+에서는 열에 NaN이 있어도 정수형을 보존할 수 있습니다(네, 케이크를 먹고 먹는 것에 대해서도 이야기하세요).수다를 지정할 수 .dtype='Int32'
df = pd.read_csv('file.csv', na_values=['-'], dtype='Int32')
df
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
df.dtypes
A Int32
B Int32
dtype: object
dtype이 기존 int type이 아닙니다...대신 Nullable Integer Type입니다.다른 선택지도 있습니다.
데이터 처리: :pd.to_numeric
와 함께errors='coerce
숫자 데이터를 다루는 경우, 보다 빠른 솔루션은errors='coerce'
값 수 을 NaN으로 naN에값수로는값할을다는로된을다)는,t로로값 ).
pd.to_numeric(df['A'], errors='coerce')
0 NaN
1 3.0
2 2.0
3 5.0
4 1.0
5 -5.0
6 -1.0
7 NaN
8 9.0
Name: A, dtype: float64
정수 dtype(nullable)을 유지하려면 다음을 사용합니다.
pd.to_numeric(df['A'], errors='coerce').astype('Int32')
0 NaN
1 3
2 2
3 5
4 1
5 -5
6 -1
7 NaN
8 9
Name: A, dtype: Int32
여러 열을 강제로 사용하려면 다음을 사용합니다.apply
:
df[['A', 'B']].apply(pd.to_numeric, errors='coerce').astype('Int32')
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
...이후 결과를 다시 할당합니다.
자세한 내용은 이 답변에서 확인할 수 있습니다.
Pandas 버전 ≥1.0.0의 경우 다음을 사용합니다.
df.replace(old_val, pd.NA, inplace=True)
이는 두 가지 이유로 더 좋습니다.
- 대신에 사용합니다.
None
아니면np.nan
. - 선택적으로 내부 구현에 따라 메모리 효율성이 더 높을 수 있는 제자리에서 작동합니다.
df = pd.DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df = df.where(df!='-', None)
하는 것은 null 과 은 np.nan
:
import numpy as np
df.replace('-', np.nan)
은 ㅇdf.last_valid_index()
를 유효하지 않은 것으로 인식합니다.
교체 및 새 df 할당 사용:
import pandas as pd
df = pd.DataFrame(['-',3,2,5,1,-5,-1,'-',9])
dfnew = df.replace('-', 0)
print(dfnew)
(venv) D:\assets>py teste2.py
0
0 0
1 3
2 2
3 5
4 1
5 -5
df.replace('-', np.nan).astype("object")
이렇게 하면 사용할 수 있습니다.isnull()
에 당신의
또는 다음을 사용할 수도 있습니다.
df.mask(df=='-', None)
언급URL : https://stackoverflow.com/questions/17097236/replace-invalid-values-with-none-in-pandas-dataframe
'programing' 카테고리의 다른 글
XML Android 권한 목록 전체 (0) | 2023.09.17 |
---|---|
printf의 가변 크기 패딩 (0) | 2023.09.17 |
워드프레스업로드파일크기 (0) | 2023.09.17 |
특정 루트 사용자 및 호스트 이름을 만드는 중 작동하지 않음 (0) | 2023.09.17 |
ICP 2.1.0.1: 설치 실패, TASK 오류 발생 [마스터:MariaDB 서비스 시작 대기 중] (0) | 2023.09.17 |