Pandas从CSV读取DataFrame后,函数内使用astype/apply修改列类型无效的问题求助
Pandas从CSV读取DataFrame后,函数内使用astype/apply修改列类型无效的问题求助
我遇到了一个挺费解的问题,想请大家帮忙分析下原因。我写了个函数用来处理CSV数据:这个CSV里既有字符串(分类类)列,也有数值列,我的需求是保留第一列的原始类型,把从第二列开始的所有列转成数值类型——如果遇到无法转成数值的字符串,就把它设为NaN,所以用了pd.to_numeric加errors='coerce'参数。
最开始我是这么写的代码:
import pandas as pd df_temp=pd.read_csv('somefile.csv',dtype="string") df_temp.iloc[:,1:]=df_temp.iloc[:,1:].apply(pd.to_numeric,errors='coerce').copy()
我还试过用astype("category")来修改列类型,结果同样在函数里没效果:
df_temp.iloc[:,1:]=df_temp.iloc[:,1:].astype("category").copy()
奇怪的是,这段代码在Jupyter Notebook里单独运行的时候完全正常,但把它放进函数内部执行后,df_temp的列类型根本没变化,还是停留在object或者string类型,完全没被修改。
不过我找到了一个临时的 workaround:先把所有列都按category类型读取,再去转数值列:
df_temp=pd.read_csv('somefile.csv',dtype="category") df_temp.iloc[:,1:]=df_temp.iloc[:,1:].apply(pd.to_numeric,errors='coerce').copy()
这样做虽然会因为部分列是字符串和数值混合出现一些警告,但我本来就希望无法转数值的字符串变成NaN,所以这些警告我可以接受。
我现在最困惑的就是:为什么第一种写法在函数里完全不起作用?有没有人遇到过类似的情况,或者能帮我理清背后的原因?
备注:内容来源于stack exchange,提问作者Ohad
相关产品推荐
相关产品推荐

