목차
문제의 소개
먼저 그림 1과 같이 csv 파일의 내용을 살펴보세요.
그림 1
csv 파일의 "b" 열에는 int 유형과 float 유형이 모두 있음을 알 수 있습니다.
먼저 코드를 살펴보겠습니다.
from pandas import read_csv
df=read_csv('test.csv')
print(df)
인쇄물은 그림 1에 나와 있습니다.
그림 2
그림 2에서 볼 수 있듯이 "b" 열의 데이터에는 int 유형이 없고 float 유형만 있습니다. 그런 다음 DataFrame 개체를 목록 개체로 변환하면 코드는 다음과 같습니다.
from pandas import read_csv
df=read_csv('test.csv')
df_list=df.values.tolist()
print(df_list)
인쇄 결과는 그림 3에 나와 있습니다.
이미지 3
그림 3에서 볼 수 있듯이 모든 숫자는 float 유형이 되었습니다. 여기서 문제가 발생합니다. 문제는 데이터 유형이 잘못되었다는 것입니다. 세 번째 열은 int 유형이지만 ndarray로 변환하면 float 유형이 됩니다. 물론, csv 파일을 읽을 때에는 강제로 타입 변환도 하게 되는데, 여기서는 이 문제를 다루지 않겠습니다.
생각하다
소스 코드에서 "values" 속성의 반환 값 ndarray 유형이 그림 4에 표시되어 있음을 확인할 수 있습니다.
그림 4
그런 다음 코드 조각을 살펴보세요.
import numpy as np
arr=np.array([[1.0,2],[2,3]])
print(arr)
인쇄 결과는 그림 5에 나와 있습니다.
그림 5
그림 5와 이전 코드에서 우리는 강제로 유형 변환을 하지 않고 ndarray로 변환할 수 있는 데이터 유형에 float 데이터가 포함되어 있으면 전체 ndarray의 데이터 유형이 float 유형으로 변환된다는 결론을 과감하게 추론할 수 있습니다.
value 속성과 tolist 메소드를 통해 DataFrame 객체를 리스트로 변환하는 것은 빠르고 코드 한 줄이면 충분하지만, 전체 DataFrame 객체 데이터에 float 유형이 있으면 다른 열도 강제로 변환됩니다. .
해결하다
따라서 저자는 이 DataFrame의 "속성" 값에 문제가 있다고 생각합니다. 물론 사용할 수 있습니다.
저자는 완벽한 해결책을 찾지 못했기 때문에 더 귀찮은 방법을 사용했습니다. 코드는 아래와 같이 표시됩니다.
from pandas import read_csv
from pandas.core.frame import DataFrame
def DataFrame2list(df:DataFrame)->list:
df_list=[]
for row in range(df.shape[0]): # df.shape[0] 获得总行数
col_list=[]
for col in range(df.shape[1]): # df.shape[1] 获得总列数
col_list.append(df.iat[row,col]) # iat 一个一个取值
df_list.append(col_list)
return df_list
df=read_csv('test.csv')
df_list=DataFrame2list(df)
print(df_list)
위 코드는 2차 루프인데 상당히 번거롭습니다. 혹시 이 문제를 해결할 수 있는 다른 방법을 아시는 분이 계시다면 댓글란에 메시지를 남겨주세요. 인쇄 결과는 그림 6에 나와 있습니다.