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
.
여기 기써브 문제는 이 사람 덕분이야
할 수 요.nan
None
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.nan
None
팬더 버전에 따라 다르게 달성됩니다.
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
있다None
df.replace({np.nan: None})
np.nan
( 대 ( ( ( ( ( ( )
꽤 오래되었지만, 나는 우연히 같은 문제를 발견했다.다음을 수행합니다.
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
제 생각에 가장 깨끗한 방법은 이 모든 것을 이용하는 것입니다.na_value
의 pandas.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의 이 앤스웨어는 거의 모든 경우에 효과가 있었습니다.
다음 코드는 모든 열을 다음과 같이 설정합니다.object
null 값을 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
'IT' 카테고리의 다른 글
Java의 이상한 정수 상자 (0) | 2022.10.18 |
---|---|
Spring Data의 MongoTemplate와 MongoRepository의 차이점은 무엇입니까? (0) | 2022.10.18 |
문자열의 제로 패드 숫자 (0) | 2022.10.18 |
서브쿼리 vs 조인 (0) | 2022.10.18 |
Vuex - 하나의 업데이트 변환/액션으로 다른 상태 개체에 액세스하는 방법 (0) | 2022.10.18 |