programing

Pandas DataFrame에서 잘못된 값을 없음으로 바꿉니다.

yellowcard 2023. 9. 17. 12:14
반응형

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는 그렇게 할 수 없습니다.

제안은 NaN을 고수하는 것입니다.

하지만 당신의 질문에 대답하자면...

팬더 >= 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)

이는 두 가지 이유로 더 좋습니다.

  1. 대신에 사용합니다.None아니면np.nan.
  2. 선택적으로 내부 구현에 따라 메모리 효율성이 더 높을 수 있는 제자리에서 작동합니다.
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

반응형