目录
问题的引出
先看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所示。