IT

MysqlDB에서 사용할 Panda 또는 Numpy Nan을 없음으로 대체

itgroup 2022. 10. 18. 21:38
반응형

MysqlDB에서 사용할 Panda 또는 Numpy Nan을 없음으로 대체

MysqlDB를 사용하여 mysql 데이터베이스에 판다 데이터 프레임(또는 numpy 배열 사용 가능)을 쓰려고 합니다.MysqlDB는 'nan'을 이해하지 못하는 것 같고, 내 데이터베이스는 nan이 필드 리스트에 없다는 오류를 발생시킵니다.'난'을 '논타입'으로 변환할 방법을 찾아야 합니다.

좋은 생각 있어요?

@paramatron이 옳습니다.팬더에서 원어민으로 할 수 있다는 것을 주의해 주세요.

df1 = df.where(pd.notnull(df), None)

주의: 그러면 모든 열의 dtype이 다음과 같이 변경됩니다.object.

예제:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where(pd.notnull(df), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

: 수 것:dtype모든 데이터 타입을 허용하려면 , 를 사용한 후 DataFrame 메서드를 사용합니다.

df1 = df.astype(object).replace(np.nan, 'None')

유감스럽게도 이 방법이나 사용법 모두None이 (종료된) 호를 참조해 주세요.


이와는 별도로 대부분의 사용 사례는 NaN을 None으로 교체할 필요가 없습니다. 팬더에서 NaN과 None의 차이점에 대한 질문을 참조하십시오.

다만, 이 특정의 경우는, (적어도 이 회답의 시점에서는) 알고 있는 것 같습니다.

df = df.replace({np.nan: None})

주의: 이렇게 하면 영향을 받는 모든 열의 dtype이 다음과 같이 변경됩니다.object.

여기 기써브 문제는 이 사람 덕분이야

할 수 요.nanNone numpy ":

>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>

어슬렁어슬렁 돌아다닌 후, 이것은 나에게 효과가 있었다.

df = df.astype(object).where(pd.notnull(df),None)

또 다른 추가 사항: 여러 개를 교체하고 기둥의 유형을 개체에서 플로트로 변환할 때 주의하십시오.만약 당신이 확실히 하고 싶다면None로로로 않다np.NaN@andy-handden 을 하여 @의 을 적용합니다.pd.where ' 수 교환이 여전히 '잘못'될 수 있음을 보여주는 그림:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})

In [4]: df
Out[4]:
     a
0  1.0
1  NaN
2  inf

In [5]: df.replace({np.NAN: None})
Out[5]:
      a
0     1
1  None
2   inf

In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
     a
0  1.0
1  NaN
2  NaN

In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
     a
0  1.0
1  NaN
2  NaN

@Andy Hayden의 답변에 덧붙입니다.

는 의 반대쪽 트윈이므로 시그니처는 완전히 같지만 의미는 반대입니다.

  • DataFrame.where조건이 False일 경우 을 치환할 때 유용합니다.
  • DataFrame.mask조건이 True인 값 치환에 사용됩니다.

이에서는요, 이 에서는요.df.mask(df.isna(), other=None, inplace=True)좀 더 직관적일 수도 있어요.

np.nanNone팬더 버전에 따라 다르게 달성됩니다.

if version.parse(pd.__version__) >= version.parse('1.3.0'):
    df = df.replace({np.nan: None})
else:
    df = df.where(pd.notnull(df), None)

버전 .의 경우, 【1.3.0】의 이 【1.3.0】의 이면, 【13.0】의 문제가 됩니다.df 있다Nonedf.replace({np.nan: None})np.nan( 대 ( ( ( ( ( ( )

꽤 오래되었지만, 나는 우연히 같은 문제를 발견했다.다음을 수행합니다.

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

제 생각에 가장 깨끗한 방법은 이 모든 것을 이용하는 것입니다.na_valuepandas.DataFrame.to_numpy()메서드(표준):

na_value : 임의, 옵션

결측값에 사용할 값입니다.기본값은 dtype 및 DataFrame 열의 dtype에 따라 달라집니다.

버전 1.1.0의 새로운 기능

예를 들어 NaN이 없음으로 대체된 사전으로 변환할 수 있습니다.

columns = df.columns.tolist()
dicts_with_nan_replaced = [
    dict(zip(columns, x))
    for x in df.to_numpy(na_value=None)
]

numpy NaN을 panda NA로 변환한 후 다음 문장으로 대체합니다.

df = df.replace(np.NaN, pd.NA).where(df.notnull(), None)

혹시 검토해야 할 코드 블록이 있나요?

팬더는 .loc를 사용하여 논리 조건(예:)에 따라 레코드에 액세스하고 =를 사용할 때 해당 레코드로 작업을 수행할 수 있습니다..loc 마스크를 어떤 값과 동일하게 설정하면 반환 배열이 변경됩니다(따라서 여기서 터치 주의하세요.코드 블록에서 사용하기 전에 df 복사를 테스트하는 것이 좋습니다).

df.loc[df['SomeColumn'].isna(), 'SomeColumn'] = None

외부 함수는 df.loc[row_label, column_label] = 없음입니다.row_label에 부울마스크를 사용하여 .isna() 메서드를 사용하여 SomeColumn의 'NoneType' 값을 찾습니다.

.isna() 메서드를 사용하여 row_label:df['SomeColumn'].isna() 에서 행/레코드의 부울 배열을 반환합니다.SomeColumn에 팬더가 .isna() 메서드로 체크하는 'NoneType' 항목이 있는 모든 행을 분리합니다.

column_label은 row_label의 데이터 프레임을 마스킹할 때와 .loc 마스크에 대해 작업하는 열을 식별하는 데 모두 사용합니다.

마지막으로 .loc 마스크를 None으로 설정했기 때문에 마스크된 인덱스에 따라 반환되는 행/레코드가 None으로 변경됩니다.

다음은 .loc 및 .isna()에 대한 판다 문서 링크입니다.

고고: :
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.htmlhttpspandas.pydata.org/docs//api/pandas.DataFrame.loc.htmlhttps://pandas.pydata.org/docs/reference/api/pandas.DataFrame.isna.htmlhttpspandas.pydata.org/docs//api/pandas.DataFrame.isna.html

판다를 1.3.2로 업데이트한 후 추천 답변도 대안도 내 응용 프로그램에 효과가 없다는 것을 알게 된 후, 나는 무차별적인 접근으로 안전에 만족했다.

buf = df.to_json(orient='records')
recs = json.loads(buf)

또 다른 선택지가 실제로 효과가 있었습니다.

df = df.astype(object).replace(np.nan, None)

놀랍게도, 이전의 답변들은 모두 나에게 효과가 없었기 때문에, 나는 각 칼럼마다 그것을 해야 했다.

for column in df.columns:
            df[column] = df[column].where(pd.notnull(df[column]), None)

지금은 손으로 하는 것밖에 방법이 없어요.

@rodney cox의 이 앤스웨어는 거의 모든 경우에 효과가 있었습니다.

다음 코드는 모든 열을 다음과 같이 설정합니다.objectnull 값을 None으로 바꿉니다.기둥 데이터 유형을 개체로 설정하는 것은 팬더가 유형을 더 이상 변경하지 못하도록 하기 때문에 매우 중요합니다.

for col in df.columns:
    df[col] = df[col].astype(object)
    df.loc[df[col].isnull(), col] = None

경고:이 솔루션은 np.nan 값이 없는 열을 처리하기 때문에 효율적이지 않습니다.

이 방법은 효과가 있었습니다.

df = df.fillna(0)

언급URL : https://stackoverflow.com/questions/14162723/replacing-pandas-or-numpy-nan-with-a-none-to-use-with-mysqldb

반응형