목록 목록으로 표시된 테이블을로 변환하고 싶습니다 Pandas DataFrame
. 매우 단순화 된 예로서 :
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
열을 적절한 유형으로 변환하는 가장 좋은 방법은 무엇입니까?이 경우 열 2와 3은 부동 소수점으로? DataFrame으로 변환하는 동안 유형을 지정하는 방법이 있습니까? 아니면 먼저 DataFrame을 만든 다음 열을 반복하여 각 열의 유형을 변경하는 것이 더 낫습니까? 수백 개의 열이있을 수 있고 어떤 유형의 열을 정확하게 지정하고 싶지 않기 때문에 이상적으로 동적 방식 으로이 작업을 수행하고 싶습니다. 보장 할 수있는 것은 각 열에 동일한 유형의 값이 포함되어 있다는 것입니다.
답변
팬더에서 유형을 변환하기위한 세 가지 주요 옵션이 있습니다.
-
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)
대신 사용할 수 있습니다 .
답변
이건 어때요?
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df
Out[16]:
one two three
0 a 1.2 4.2
1 b 70 0.03
2 x 5 0
df.dtypes
Out[17]:
one object
two object
three object
df[['two', 'three']] = df[['two', 'three']].astype(float)
df.dtypes
Out[19]:
one object
two float64
three float64
답변
아래 코드는 열의 데이터 유형을 변경합니다.
df[['col.name1', 'col.name2'...]] = df[['col.name1', 'col.name2'..]].astype('data_type')
데이터 유형 대신에 데이터 유형을 제공 할 수 있습니다. str, float, int 등과 같은 것을 원하십니까?
답변
특정 열만 지정하고 명시 적으로 표현하고 싶을 때 ( DOCS LOCATION 당 ) 사용했습니다.
dataframe = dataframe.astype({'col_name_1':'int','col_name_2':'float64', etc. ...})
따라서 원래 질문을 사용하지만 열 이름을 제공하면 …
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['col_name_1', 'col_name_2', 'col_name_3'])
df = df.astype({'col_name_2':'float64', 'col_name_3':'float64'})
답변
다음은 인수로 DataFrame 및 열 목록을 사용하고 열의 모든 데이터를 숫자로 강제 변환하는 함수입니다.
# df is the DataFrame, and column_list is a list of columns as strings (e.g ["col1","col2","col3"])
# dependencies: pandas
def coerce_df_columns_to_numeric(df, column_list):
df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')
예를 들어,
import pandas as pd
def coerce_df_columns_to_numeric(df, column_list):
df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['col1','col2','col3'])
coerce_df_columns_to_numeric(df, ['col2','col3'])
답변
열에 대해 서로 다른 데이터 유형을 가진 두 개의 데이터 프레임을 만든 다음 함께 추가하는 것은 어떻습니까?
d1 = pd.DataFrame(columns=[ 'float_column' ], dtype=float)
d1 = d1.append(pd.DataFrame(columns=[ 'string_column' ], dtype=str))
결과
In[8}: d1.dtypes
Out[8]:
float_column float64
string_column object
dtype: object
데이터 프레임을 만든 후에는 첫 번째 열의 부동 소수점 변수와 두 번째 열의 문자열 (또는 원하는 데이터 유형)을 채울 수 있습니다.
답변
팬더> = 1.0
다음은 팬더에서 가장 중요한 전환을 요약 한 차트입니다.
문자열로의 변환은 사소한 것이며 .astype(str)
그림에는 표시되지 않습니다.
“하드”대 “소프트”변환
이 문맥에서 “변환”은 텍스트 데이터를 실제 데이터 형식으로 변환 (하드 변환)하거나 개체 열의 데이터에 더 적합한 데이터 형식을 유추하는 것 (소프트 변환)을 의미 할 수 있습니다. 차이점을 설명하기 위해
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': [4, 5, 6]}, dtype=object)
df.dtypes
a object
b object
dtype: object
# Actually converts string to numeric - hard conversion
df.apply(pd.to_numeric).dtypes
a int64
b int64
dtype: object
# Infers better data types for object data - soft conversion
df.infer_objects().dtypes
a object # no change
b int64
dtype: object
# Same as infer_objects, but converts to equivalent ExtensionType
df.convert_dtypes().dtypes