pandas读取到的数据转list的问题

目录

问题的引出

图1

图2

图3

思考

图4

图5

解决

图6


问题的引出

先看csv文件的内容,如图1

图1

可以看出csv文件中的“b”列既有int类型,也有float类型的

先看一段代码。

from pandas import read_csv
df=read_csv('test.csv')
print(df)

打印的如图1所示。

图2

从图2中可以看出,“b”列的数据只有float类型、没有int类型了。接着把DataFrame对象转list对象,代码如下

from pandas import read_csv
df=read_csv('test.csv')
df_list=df.values.tolist()
print(df_list)

打印结果如图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类型。

虽然通过values属性和tolist方法把DataFrame对象转list是快捷的,一行代码就可以,但是整个DataFrame对象数据中有一个float类型,那么其他列也会强制转换。

解决

因此,笔者认为这个DataFrame的values“属性”有问题。当然可以用。

笔者并没有找到完美的方法解决,所以用了比较麻烦的方法。代码如下。

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)

上面代码就是一个二次循环,比较麻烦,如果有大佬知道其他方法解决这个问题,可以在评论区留言。打印结果如图6所示。

图6

猜你喜欢

转载自blog.csdn.net/qq_63401240/article/details/132769531