팬더가 읽은 데이터를 목록으로 변환하는 데 문제가 있습니다.

목차

문제의 소개

그림 1

그림 2

이미지 3

생각하다

그림 4

그림 5

해결하다

그림 6


문제의 소개

먼저 그림 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에 나와 있습니다.

그림 6

추천

출처blog.csdn.net/qq_63401240/article/details/132769531