programing

Python panda: Excel 파일을 읽을 때 데이터 유형을 지정하는 방법은 무엇입니까?

lovecodes 2023. 9. 2. 09:15
반응형

Python panda: Excel 파일을 읽을 때 데이터 유형을 지정하는 방법은 무엇입니까?

Excel 파일을 Pandas 데이터 프레임으로 가져오는 중입니다.pandas.read_excel()기능.

열 중 하나는 표의 기본 키입니다. 모든 숫자이지만 텍스트로 저장됩니다(Excel 셀 왼쪽 상단의 작은 녹색 삼각형이 이를 확인합니다).

그러나 파일을 판다 데이터 프레임으로 가져오면 열이 부동으로 가져옵니다.이것은 예를 들어 '0614'가 614가 된다는 것을 의미합니다.

열을 가져올 때 데이터 유형을 지정하는 방법이 있습니까?CSV 파일을 가져올 때 가능한 것으로 알고 있지만 구문에서 아무것도 찾을 수 없습니다.read_excel().

제가 생각할 수 있는 유일한 해결책은 Excel에서 텍스트 시작 부분에 임의의 문자를 추가하여('0614'를 'A0614'로 변환) 열을 텍스트로 가져온 다음 python에서 'A'를 잘라 SQL에서 가져오는 다른 테이블과 일치시킬 수 있도록 하는 것입니다.

변환기만 지정하면 됩니다.다음 구조의 Excel 스프레드시트를 만들었습니다.

names   ages
bob     05
tom     4
suzy    3

여기서 "연령" 열은 문자열 형식입니다.로드 방법:

import pandas as pd

df = pd.read_excel('Book1.xlsx',sheetname='Sheet1',header=0,converters={'names':str,'ages':str})
>>> df
       names ages
   0   bob   05
   1   tom   4
   2   suzy  3

시작v0.20.0,그dtype함수의 키워드 인수를 사용하여 대/소문자가 존재하는 것처럼 열에 적용해야 하는 데이터 유형을 지정할 수 있습니다.

사용.converters그리고.dtype동일한 열 이름에 대한 인수를 함께 사용하면 후자가 음영 처리되고 전자가 선호됩니다.


그것이 해석하지 않기 위해서.dtypes하지만 오히려 이전에 파일에 원래 있었던 것처럼 열의 모든 내용을 전달하면, 우리는 이 Arg를 다음으로 설정할 수 있습니다.str또는object데이터를 손상시키지 않도록 합니다.(이러한 경우 중 하나는 숫자의 선두 0이 될 수 있으며 그렇지 않으면 손실될 수 있습니다.)

pd.read_excel('file_name.xlsx', dtype=str)            # (or) dtype=object

그것은 심지어 딕트 매핑을 지원합니다.keys열 이름을 구성합니다.values특히 당신이 변경하고 싶을 때 각각의 데이터 유형이 설정됩니다.dtype모든 열의 부분 집합에 대해.

# Assuming data types for `a` and `b` columns to be altered
pd.read_excel('file_name.xlsx', dtype={'a': np.float64, 'b': np.int32})

데이터 프레임의 열 수와 이름을 모르는 경우 다음 방법을 사용할 수 있습니다.

column_list = []
df_column = pd.read_excel(file_name, 'Sheet1').columns
for i in df_column:
    column_list.append(i)
converter = {col: str for col in column_list} 
df_actual = pd.read_excel(file_name, converters=converter)

여기서 column_list는 열 이름의 목록입니다.

Excel 파일을 올바르게 읽을 수 있고 정수 값만 표시되지 않는 경우.다음과 같이 지정할 수 있습니다.

df = pd.read_excel('my.xlsx',sheetname='Sheet1', engine="openpyxl", dtype=str)

이것은 당신의 정수 값을 문자열로 바꾸고 데이터 프레임에 표시해야 합니다.

read_excel() 함수에는 특정 열에 있는 입력에 함수를 적용할 수 있는 변환기 인수가 있습니다.이를 사용하여 문자열로 유지할 수 있습니다.설명서:

특정 열에서 값을 변환하기 위한 함수의 딕트입니다.키는 정수 또는 열 레이블일 수 있으며, 값은 하나의 입력 인수인 Excel 셀 내용을 사용하고 변환된 내용을 반환하는 함수입니다.

코드 예제:

pandas.read_excel(my_file, converters = {my_str_column: str})

열 이름을 모르는 경우 모든 열에 str 데이터 유형을 지정하려면 다음을 수행합니다.

table = pd.read_excel("path_to_filename")
cols = table.columns
conv = dict(zip(cols ,[str] * len(cols)))
table = pd.read_excel("path_to_filename", converters=conv)

키의 자릿수가 고정된 경우 숫자 데이터가 아닌 텍스트로 저장해야 합니다.사용할 수 있습니다.converters 또는 논쟁또read_excel이를 위하여

또는 이 방법으로 작동하지 않는 경우 데이터가 데이터 프레임에 읽혀지면 데이터를 조작합니다.

df['key_zfill'] = df['key'].astype(str).str.zfill(4)

  names   key key_zfill
0   abc     5      0005
1   def  4962      4962
2   ghi   300      0300
3   jkl    14      0014
4   mno    20      0020

converters또는dtype항상 도움이 되는 것은 아닙니다.특히 날짜/시간 및 기간(이상적으로 두 가지가 혼합된...)의 경우 사후 처리가 필요합니다.이러한 경우 Excel 파일의 내용을 기본 제공 형식으로 읽고 이 형식에서 데이터 프레임을 생성하는 것도 하나의 옵션이 될 수 있습니다.

여기 예시 파일이 있습니다."duration" 열에는 HH 단위의 지속 시간 값이 포함됩니다.MM:SS 및 잘못된 값 "-"입니다.

excel_sample

시간이 24보다 작으면 Excel은 항목을 시간으로 형식을 지정하고, 그렇지 않으면 기간으로 형식을 지정합니다.는 원하는유 타입을 원했습니다.timedelta데이터 프레임의 전체 열에 대해.pandas가져오기를 망칩니다.

import pandas as pd
df = pd.read_excel("path-to-file")

df.duration
# 0               12:30:00
# 1    1900-01-01 00:30:00
# 2                      -
# 3    1900-01-01 23:55:01
# Name: duration, dtype: object

[type(i) for i in df.duration]
# [datetime.time, datetime.datetime, str, datetime.datetime]

이제 datetime.datetime과 datetime이 있습니다.시간 객체, 그리고 지속 시간(델타)을 되돌리는은 어렵습니다!당신은 그것을 직접 할 수 있습니다.converter하지만 그렇다고 덜 어려운 건 아닙니다.

여기서 저는 엑셀 로더 엔진을 직접 사용하는 것이 실제로 더 쉽다는 것을 알게 되었습니다.

from openpyxl import load_workbook
wb = load_workbook('path-to-file')

sheet = wb['Tests'] # adjust sheet name, this is for the demo file
data = list(sheet.values) # a list of tuples, one tuple for each row
df = pd.DataFrame(data[1:], columns=data[0]) # first tuple is column names

df['duration']
# 0           12:30:00
# 1     1 day, 0:30:00
# 2                  -
# 3    1 day, 23:55:01
# Name: duration, dtype: object

[type(i) for i in df['duration']]
# [datetime.time, datetime.timedelta, str, datetime.timedelta]

그래서 이제 우리는 이미 약간의 시간 델타 물체를 가지고 있습니다!다른 시간 델타로의 변환은 다음과 같이 간단하게 수행할 수 있습니다.

df['duration'] = pd.to_timedelta(df.duration.astype(str), errors='coerce')
df['duration']
# 0   0 days 12:30:00
# 1   1 days 00:30:00
# 2               NaT
# 3   1 days 23:55:01
# Name: duration, dtype: timedelta64[ns]

언급URL : https://stackoverflow.com/questions/32591466/python-pandas-how-to-specify-data-types-when-reading-an-excel-file

반응형