팬더에서 유형을 변환하기위한 세 가지 주요 옵션이 있습니다.
to_numeric()
-숫자가 아닌 유형 (예 : 문자열)을 적합한 숫자 유형으로 안전하게 변환하는 기능을 제공합니다. ( to_datetime()
및 참조 to_timedelta()
)
astype()
-반드시 (거의) 모든 유형을 (거의) 다른 유형으로 변환하십시오 (필수적으로 합리적이지 않더라도). 또한 범주 유형 으로 변환 할 수 있습니다 (매우 유용).
infer_objects()
-가능하면 파이썬 객체를 보유한 객체 열을 팬더 유형으로 변환하는 유틸리티 메소드.
이러한 각 방법에 대한 자세한 설명과 사용법을 읽으십시오.
1. to_numeric()
DataFrame의 하나 이상의 열을 숫자 값으로 변환하는 가장 좋은 방법은을 사용하는 것 pandas.to_numeric()
입니다.
이 함수는 숫자가 아닌 객체 (예 : 문자열)를 정수 또는 부동 소수점 숫자로 적절하게 변경하려고 시도합니다.
기본 사용법
입력 to_numeric()
은 시리즈 또는 DataFrame의 단일 열입니다.
>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0 8
1 6
2 7.5
3 3
4 0.9
dtype: object
>>> pd.to_numeric(s) # convert everything to float values
0 8.0
1 6.0
2 7.5
3 3.0
4 0.9
dtype: float64
보시다시피, 새 시리즈가 반환됩니다. 계속 사용하려면이 출력을 변수 또는 열 이름에 할당해야합니다.
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
또한 apply()
메소드 를 통해 DataFrame의 여러 열을 변환하는 데 사용할 수 있습니다 .
# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame
# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
값을 모두 변환 할 수있는 한 필요한 것입니다.
오류 처리
그러나 일부 값을 숫자 유형으로 변환 할 수 없으면 어떻게됩니까?
to_numeric()
또한 errors
숫자가 아닌 값을 강제로 NaN
또는 키워드가 포함 된 열을 무시 하도록 하는 키워드 인수를 사용 합니다.
다음 s
은 dtype 객체가 있는 일련의 문자열 을 사용하는 예입니다 .
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
기본 동작은 값을 변환 할 수없는 경우 올리는 것입니다. 이 경우 문자열 'pandas'에 대처할 수 없습니다.
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
실패하기보다는 '팬더'가 누락되거나 잘못된 숫자 값으로 간주되기를 원할 수 있습니다. 키워드 인수를 NaN
사용하여 유효하지 않은 값을 다음과 같이 강제 변환 할 수 있습니다 errors
.
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
세 번째 옵션 errors
은 유효하지 않은 값이 발견되면 작업을 무시하는 것입니다.
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
이 마지막 옵션은 전체 DataFrame을 변환하려고 할 때 특히 유용하지만 어떤 열을 숫자 유형으로 안정적으로 변환 할 수 있는지 모릅니다. 이 경우 다음과 같이 작성하십시오.
df.apply(pd.to_numeric, errors='ignore')
이 함수는 DataFrame의 각 열에 적용됩니다. 숫자 형식으로 변환 할 수있는 열은 변환되지만 숫자가 아닌 문자열이나 날짜를 포함 할 수없는 열은 그대로 유지됩니다.
다운 캐스팅
기본적으로로 변환 to_numeric()
하면 a int64
또는 float64
dtype (또는 플랫폼에 고유 한 정수 너비)이 제공됩니다.
즉 당신이 원하는 일반적으로,하지만 당신이 더 컴팩트 DTYPE, 같은 일부 메모리를 저장하고 사용하기를 원한다면 float32
, 또는 int8
?
to_numeric()
'정수', '서명 된', '서명되지 않은', '부동'으로 다운 캐스트 할 수있는 옵션을 제공합니다. 다음은 간단한 일련 s
의 정수 유형에 대한 예입니다 .
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
'정수'로 다운 캐스팅하면 값을 보유 할 수있는 가장 작은 정수를 사용합니다.
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
'float'로 다운 캐스팅 할 때와 마찬가지로 일반 부동 유형보다 작은 것을 선택합니다.
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
2. astype()
이 astype()
방법을 사용하면 DataFrame 또는 Series에 원하는 dtype을 명시 적으로 지정할 수 있습니다. 한 유형에서 다른 유형으로 시도하고 이동할 수 있다는 점에서 매우 다양합니다.
기본 사용법
유형을 선택하기 만하면 NumPy dtype (예 :) np.int16
, 일부 Python 유형 (예 : bool) 또는 팬더 관련 유형 (예 : 범주 형 dtype)을 사용할 수 있습니다.
변환하려는 객체에서 메소드를 호출하면 자동으로 변환 astype()
됩니다.
# convert all DataFrame columns to the int64 dtype
df = df.astype(int)
# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})
# convert Series to float16 type
s = s.astype(np.float16)
# convert Series to Python strings
s = s.astype(str)
# convert Series to categorical type - see docs for more details
s = s.astype('category')
주의 사항 "시도"라고 astype()
말하면 Series 또는 DataFrame에서 값을 변환하는 방법을 모르면 오류가 발생합니다. 예를 들어 NaN
또는 inf
값이 있으면 정수로 변환하려고하면 오류가 발생합니다.
팬더 0.20.0부터는이 오류를 전달하여 억제 할 수 있습니다 errors='ignore'
. 원래 개체는 그대로 유지됩니다.
조심해
astype()
강력하지만 때때로 "잘못된"값을 변환합니다. 예를 들면 다음과 같습니다.
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
이들은 작은 정수이므로 부호없는 8 비트 유형으로 변환하여 메모리를 절약하는 것은 어떻습니까?
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
변환은 일을하지만,이 -7 249이 될 라운드 포장 된 (즉, 2 (8) - 7)!
pd.to_numeric(s, downcast='unsigned')
대신 사용하여 다운 캐스트를 시도 하면이 오류를 방지하는 데 도움이 될 수 있습니다.
삼. infer_objects()
pandas 버전 0.21.0 infer_objects()
에는 객체 데이터 유형이있는 DataFrame의 열을보다 구체적인 유형 (소프트 변환)으로 변환 하는 방법이 도입되었습니다 .
예를 들어 다음은 두 개의 객체 유형 열이있는 DataFrame입니다. 하나는 실제 정수를 보유하고 다른 하나는 정수를 나타내는 문자열을 보유합니다.
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
을 사용하여 infer_objects()
열 'a'의 유형을 int64로 변경할 수 있습니다.
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
'b'열은 값이 정수가 아닌 문자열이므로 단독으로 남겨졌습니다. 두 열을 정수 유형으로 강제 변환하려고하면 df.astype(int)
대신 사용할 수 있습니다 .