NaNs가 들어 있는 판다 컬럼을 dtype 'int'로 변환
나는 아래와 같이 .csv 파일의 자료를 팬더 데이터프레임으로 읽는다. 중 즉 열 하하나, 즉id
, 열 유형을 다음과 같이 지정하십시오.int
문제는 이다.id
시리즈에 결측값/불합치 값이 있음.
내가 캐스팅하려고 할 때id
.csv를 읽는 동안 열에서 정수까지, 나는 다음을 얻는다.
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
또는 아래와 같이 읽은 후 칼럼 타입을 변환하려고 했지만, 이번에는 다음과 같은 결과를 얻는다.
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
이걸 어떻게 해결하지?
정수기둥에 NaN rep의 부족은 판다 "gotcha"이다.
일반적인 해결책은 단순히 부유물을 사용하는 것이다.
버전 0.24.+에서 판다는 누락된 값을 가진 정수 dtype을 보유할 수 있는 능력을 얻었다.
판다는 를 사용하여 정수 데이터를 나타낼 수 있으며, 결측값이 있을 수 있다.이것은 팬더 내에서 시행되는 확장형이다.정수의 기본 dtype이 아니며 추론되지 않는다. dtype을 명시적으로 또는 에 전달해야 한다.Series
:
arr = pd.array([1, 2, np.nan], dtype=pd.Int64Dtype())
pd.Series(arr)
0 1
1 2
2 NaN
dtype: Int64
열을 null 가능 정수로 변환하는 경우:
df['myCol'] = df['myCol'].astype('Int64')
DB 테이블에 로드하기 전에 데이터를 블랭킹하는 경우:
df[col] = df[col].fillna(-1)
df[col] = df[col].astype(int)
df[col] = df[col].astype(str)
df[col] = df[col].replace('-1', np.nan)
NaNs를 제거하고 int로 변환한 다음 str로 변환한 다음 NAN을 다시 삽입하십시오.
예쁘지는 않지만 일을 완성해!
수 .int
그것은 현재 팬더 0.24.0에 공식적으로 추가되기 때문에.
팬더 0.24.x 릴리스 노트 인용: "판다스는 누락된 값을 가진 정수 dtype을 보유할 수 있는 능력을 얻었다.
한 열에 정수와 NaNs를 반드시 결합하려면 '개체' 데이터 유형을 사용하십시오.
df['col'] = (
df['col'].fillna(0)
.astype(int)
.astype(object)
.where(df['col'].notnull())
)
이것은 NaNs를 정수(어떤 것이든 상관 없음)로 대체하고, int로 변환하고, 객체로 변환하고, 마지막으로 NaNs를 다시 삽입한다.
나는 몇 주 전에 '객체'로 포맷된 몇 가지 별개의 특징에 문제가 있었다.이 해결책이 효과가 있는 것 같았다.
for col in discrete:
df[col] = pd.to_numeric(df[col],errors='coerce').astype(pd.Int64Dtype())
당신은 사용할 수 있다..dropna()
NaN 값이 있는 행을 삭제해도 되는지 여부.
df = df.dropna(subset=['id'])
또를 한다..fillna()
그리고.astype()
NaN을 값으로 대체하고 이를 int로 변환한다.
정수가 큰 CSV 파일을 처리할 때 일부 누락된 상태(NaN)에서 이런 문제에 부딪쳤다.플로트를 유형으로 사용하는 것은 내가 정밀도를 떨어뜨릴 수도 있기 때문에 선택사항이 아니었다.
내 해결책은 str을 중간 타입으로 사용하는 것이었다.그러면 나중에 코드에서 원하는 대로 문자열을 int로 변환할 수 있다.나는 NaN을 0으로 교체했지만, 너는 어떤 값이든 선택할 수 있어.
df = pd.read_csv(filename, dtype={'id':str})
df["id"] = df["id"].fillna("0").astype(int)
그림의 경우, 플로트가 정밀도를 떨어뜨릴 수 있는 예는 다음과 같다.
s = "12345678901234567890"
f = float(s)
i = int(f)
i2 = int(s)
print (f, i, i2)
그리고 그 결과:
1.2345678901234567e+19 12345678901234567168 12345678901234567890
팬더 1.0.0은 이제 팬더를 사용할 수 있다.NA 값.이는 결측값이 있는 정수 열을 강제로 부동으로 만들지는 않는다.
데이터에서 읽을 때 해야 할 일은 다음과 같다.
df= pd.read_csv("data.csv", dtype={'id': 'Int64'})
'Int64'는 인용문으로 둘러싸여 있고 I는 대문자로 되어 있다는 것을 주목하라.이것은 판다의 'Int64'와 Numpy의 'Int64'를 구별한다.
참고로 이것은 .astype()에서도 작동한다.
df['id'] = df['id'].astype('Int64')
설명서: https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html
저장된 데이터를 수정할 수 있는 경우 누락에 대한 Sentinel 값을 사용하십시오.id
. 열 이름으로 유추되는 일반적인 사용 사례.id
큰 0보다 큰 정수로, 0보다 큰 0을 할 수 .0
당신이 쓸 수 있도록 보초값으로.
if row['id']:
regular_process(row)
else:
special_process(row)
여기 있는 대부분의 솔루션은 null을 나타내기 위해 자리 표시자 정수를 사용하는 방법을 알려준다.하지만 만약 당신이 당신의 소스 데이터에 정수가 나타나지 않을 것이라는 확신이 없다면, 그 접근법은 도움이 되지 않는다.유언장을 가진 나의 방법은 십진수 값 없이 부동하고 null을 없음으로 변환한다.결과는 CSV에 로드될 때 null 값이 있는 정수 필드처럼 보이는 개체 데이터 유형이다.
keep_df[col] = keep_df[col].apply(lambda x: None if pandas.isnull(x) else '{0:.0f}'.format(pandas.to_numeric(x)))
당신의 판다 시리즈가object
데이터 유형 또는 단순float
데이터 유형 아래 메소드가 작동함
df = pd.read_csv("data.csv")
df['id'] = df['id'].astype(float).astype('Int64')
import pandas as pd
df= pd.read_csv("data.csv")
df['id'] = pd.to_numeric(df['id'])
메서드를 연결할 때 이 옵션을 사용하려면 할당을 사용하십시오.
df = (
df.assign(col = lambda x: x['col'].astype('Int64'))
)
사용하다.fillna()
모든 것을 대체하다NaN
을 중시하다.0
변환한다.int
사용.astype(int)
df['id'] = df['id'].fillna(0).astype(int)
NULL/NaN 포함 컬럼 내에 int 값을 가져야 하지만 다른 답변에서 언급된 팬더 버전 0.24.0 무효 정수 기능을 사용할 수 없다는 제약 하에 작업하는 모든 사용자를 위해 pd를 사용하여 컬럼을 객체 유형으로 변환할 것을 제안한다.여기서:
df = df.where(pd.notnull(df), None)
이것은 데이터 프레임의 모든 NaN을 없음으로 변환하여 혼합형 열을 객체로 처리하지만 int 값은 플로트가 아닌 int로 처리한다.
먼저 새로운 정수 유형인 Int8(...)을 지정해야 한다.Null 정수 데이터를 처리할 수 있는 Int64)(팬다스 버전 >= 0.24.0)
df = df.astype('Int8')
그러나 NaN/nulls와 정수 데이터가 혼합된 특정 열만 대상으로 지정할 수 있다.
df = df.astype({'col1':'Int8','col2':'Int8','col3':'Int8')
이 때 NaN's는 로 전환된다.<NA>
기본 null 값을 df.fillna(),로 변경하려면 변경할 열의 객체 데이터 유형을 강제 적용해야 하며 그렇지 않으면TypeError: <U1 cannot be converted to an IntegerDtype
당신은 이것을 할 수 있다.df = df.astype(object)
모든 열 데이터 유형을 개체로 변경해도 괜찮다면(각 값 유형은 여전히 보존됨) ...ORdf = df.astype({"col1": object,"col2": object})
개별 열을 대상으로 지정하려는 경우
이렇게 하면 null이 혼합된 정수 열이 정수로 포맷된 상태를 유지하고 null 값을 원하는 값으로 변경하도록 하는 데 도움이 된다.나는 이 방법의 효율성에 대해 말할 수 없지만, 그것은 나의 포맷과 인쇄 용도에 효과가 있었다.
나는 피스파크와 함께 일하면서 이 문제에 부딪쳤다.jvm에서 실행 중인 코드에 대한 python 프런트엔드인 만큼 형식 안전이 필요하며 int 대신 float를 사용하는 것은 선택사항이 아니다.나는 팬더를 싸서 그 문제를 해결했다.pd.read_csv
필요한 유형에 캐스팅하기 전에 사용자 정의 열을 사용자 정의 채우기 값으로 채우는 함수.내가 사용하게 된 것은 다음과 같다.
def custom_read_csv(file_path, custom_dtype = None, fill_values = None, **kwargs):
if custom_dtype is None:
return pd.read_csv(file_path, **kwargs)
else:
assert 'dtype' not in kwargs.keys()
df = pd.read_csv(file_path, dtype = {}, **kwargs)
for col, typ in custom_dtype.items():
if fill_values is None or col not in fill_values.keys():
fill_val = -1
else:
fill_val = fill_values[col]
df[col] = df[col].fillna(fill_val).astype(typ)
return df
다음을 시도해 보십시오.
df[['id']] = df[['id']].astype(pd.Int64Dtype())
프린트하면.dtypes
, 당신은 얻을 것이다.id Int64
보통 대신하여one int64
다음 해결책은 내 목적에 맞는 유일한 해결책이며, 최근 판다를 사용할 때 가장 좋은 해결책이라고 생각한다.
df['A'] = np.floor(pd.to_numeric(df['A'],
errors='coerce'))
.astype('Int64')
StackOverflow에서 솔루션을 찾았는데 자세한 내용은 아래 링크를 참조하십시오.https://stackoverflow.com/a/67021201/9294498
먼저 NaN이 포함된 행을 제거하십시오.그런 다음 나머지 행에 정수 변환을 수행하십시오.마지막으로 제거된 행을 다시 삽입하십시오.잘되길 바래.
pd.to_pd.to를 사용하다.
df["DateColumn"] = pd.to_numeric(df["DateColumn"])
소박하고 깨끗한
와의 문제.Int64
다른 많은 해결책들처럼, 만약 당신이null
가치관들, 그것들은 다음으로 대체된다.<NA>
팬더와 함께 작동하지 않는 값들은 다음과 같은 기본 'NaN' 기능들을 가지고 있다.isnull()
또는fillna()
. 또는 값을 다음으로 변환하는 경우-1
당신은 결국 당신의 정보를 삭제하는 상황에 놓이게 된다.내 해결책은 좀 어설프지만 제공할 것이다.int
을 중시하다.np.nan
, 허용nan
자신의 가치관을 손상시키지 않고 작동할 수 있는 기능.
def to_int(x):
try:
return int(x)
except:
return np.nan
df[column] = df[column].apply(to_int)
비슷한 문제가 있었어.그것이 내 해결책이었다.
def toint(zahl = 1.1):
try:
zahl = int(zahl)
except:
zahl = np.nan
return zahl
print(toint(4.776655), toint(np.nan), toint('test'))
4나노
df = pd.read_csv("data.csv")
df['id'] = df['id'].astype(float)
df['id'] = toint(df['id'])
여기서 답을 보지 못했으니, 다음과 같이 덧붙이는 것이 좋겠다.
어떤 이유로도 np.na 또는 pd를 처리할 수 없는 경우 NAN을 빈 문자열로 변환하는 원라이너.NA는 오래된 판다가 있는 도서관에 의존할 때 나를 좋아한다.
df.select_dtypes('number').fillna(-1).astype(str).replace('-1', '')
팬더 >.24 버전과 함께 타입Int64
난을 지지하다
만약 당신의 부유물이 둥글게, 플로어, 천장 또는 둥글게 되지 않았다면 당신은 에러를 만날 수 있다.
df['A'] = np.floor(pd.to_numeric(df['A'], errors='coerce')).astype('Int64')
출처: https://stackoverflow.com/a/67021201/1363742
나는 @Digestable1010101의 접근방식이 판다 1.2.+ 버전에 더 적합하다고 생각한다. 이와 같은 것이 그 역할을 할 것이다.
df = df.astype({
'col_1': 'Int64',
'col_2': 'Int64',
'col_3': 'Int64',
'col_4': 'Int64', })
DateColumn 포맷된 3312018.0을 문자열로 2018년 3월 31일로 변환해야 한다고 가정하십시오.그리고, 일부 기록이 누락되거나 0이 된다.
df['DateColumn'] = df['DateColumn'].astype(int)
df['DateColumn'] = df['DateColumn'].astype(str)
df['DateColumn'] = df['DateColumn'].apply(lambda x: x.zfill(8))
df.loc[df['DateColumn'] == '00000000','DateColumn'] = '01011980'
df['DateColumn'] = pd.to_datetime(df['DateColumn'], format="%m%d%Y")
df['DateColumn'] = df['DateColumn'].apply(lambda x: x.strftime('%m/%d/%Y'))
참조URL: https://stackoverflow.com/questions/21287624/convert-pandas-column-containing-nans-to-dtype-int
'Programing' 카테고리의 다른 글
Uncaused TypeError: (0 , _reactRedex.combineReducers)는 함수가 아님 (0) | 2022.03.07 |
---|---|
사용 중지 경고:태핑 가능.플러그인이 더 이상 사용되지 않음..hooks에 새 API를 대신 사용 (0) | 2022.03.07 |
비단뱀의 스레드에서 반환 값을 가져오는 방법 (0) | 2022.03.07 |
공급자의 잘못된 프로펠러 자식 (0) | 2022.03.07 |
중앙 항목을 v-Flex로 시각화 (0) | 2022.03.06 |