问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python中,用pandas将字符串数据类型转换成浮点数,语法怎么写?

发布网友 发布时间:2022-04-18 05:27

我来回答

2个回答

懂视网 时间:2022-04-18 09:48


从结果来看并没有像想象中那样数值对应相加,这是因为在Pandas中object类型相加等价于Python中的字符串相加。

data.info() #在对数据进行处理之前应该先查看加载数据的相关信息


在看到加载数据的相关信息后可以发现如下几个问题:

  • 客户编号的数据类型是int64而不是object类型

  • 2016、2017列的数据类型是object而不是数值类型(int64、float64)

  • 增长率、所属组的数据类型应该为数值类型而不是object类型

  • year、month、day的数据类型应该为datetime64类型而不是object类型

  • Pandas中进行数据类型转换有三种基本方法:

  • 使用astype()函数进行强制类型转换

  • 自定义函数进行数据类型转换

  • 使用Pandas提供的函数如to_numeric()、to_datetime()

  • 使用astype()函数进行类型转换

    对数据列进行数据类型转换最简单的方法就是使用astype()函数

    data['客户编号'].astype('object')
    
    data['客户编号'] = data['客户编号'].astype('object') #对原始数据进行转换并覆盖原始数据列

    上面的结果看起来很不错,接下来给出几个astype()函数作用于列数据但失效的例子

    data['2017'].astype('float')

    data['所属组'].astype('int')


    从上面两个例子可以看出,当待转换列中含有不能转换的特殊值时(例子中¥,ErrorValue等)astype()函数将失效。有些时候astype()函数执行成功了也并不一定代表着执行结果符合预期(神坑!)

    data['状态'].astype('bool')


    乍一看,结果看起来不错,但仔细观察后,会发现一个大问题。那就是所有的值都被替换为True了,但是该列中包含好几个N标志,所以astype()函数在该列也是失效的。

    总结一下astype()函数有效的情形:

  • 数据列中的每一个单位都能简单的解释为数字(2, 2.12等)

  • 数据列中的每一个单位都是数值类型且向字符串object类型转换

  • 如果数据中含有缺失值、特殊字符astype()函数可能失效。

    使用自定义函数进行数据类型转换

    该方法特别适用于待转换数据列的数据较为复杂的情形,可以通过构建一个函数应用于数据列的每一个数据,并将其转换为适合的数据类型。

    对于上述数据中的货币,需要将它转换为float类型,因此可以写一个转换函数:

    def convert_currency(value):
     """
     转换字符串数字为float类型
     - 移除 ¥ ,
     - 转化为float类型
     """
     new_value = value.replace(',', '').replace('¥', '')
     return np.float(new_value)

    现在可以使用Pandas的apply函数通过covert_currency函数应用于2016列中的所有数据中。

    data['2016'].apply(convert_currency)


    该列所有的数据都转换成对应的数值类型了,因此可以对该列数据进行常见的数学操作了。如果利用lambda表达式改写一下代码,可能会比较简洁但是对新手不太友好。

    data['2016'].apply(lambda x: x.replace('¥', '').replace(',', '')).astype('float')

    当函数需要重复应用于多个列时,个人推荐使用第一种方法,先定义函数还有一个好处就是可以搭配read_csv()函数使用(后面介绍)。

    #2016、2017列完整的转换代码
    data['2016'] = data['2016'].apply(convert_currency)
    data['2017'] = data['2017'].apply(convert_currency)

    同样的方法运用于增长率,首先构建自定义函数

    def convert_percent(value):
     """
     转换字符串百分数为float类型小数
     - 移除 %
     - 除以100转换为小数
     """
     new_value = value.replace('%', '')
     return float(new_value) / 100

    使用Pandas的apply函数通过covert_percent函数应用于增长率列中的所有数据中。

    data['增长率'].apply(convert_percent)

    使用lambda表达式:

    data['增长率'].apply(lambda x: x.replace('%', '')).astype('float') / 100

    结果都相同:


    为了转换状态列,可以使用Numpy中的where函数,把值为Y的映射成True,其他值全部映射成False。

    data['状态'] = np.where(data['状态'] == 'Y', True, False)

    同样的你也可以使用自定义函数或者使用lambda表达式,这些方法都可以完美的解决这个问题,这里只是多提供一种思路。

    利用Pandas的一些辅助函数进行类型转换

    Pandas的astype()函数和复杂的自定函数之间有一个中间段,那就是Pandas的一些辅助函数。这些辅助函数对于某些特定数据类型的转换非常有用(如to_numeric()、to_datetime())。所属组数据列中包含一个非数值,用astype()转换出现了错误,然而用to_numeric()函数处理就优雅很多。

    pd.to_numeric(data['所属组'], errors='coerce').fillna(0)


    可以看到,非数值被替换成0.0了,当然这个填充值是可以选择的,具体文档见
    pandas.to_numeric - pandas 0.22.0 documentation

    Pandas中的to_datetime()函数可以把单独的year、month、day三列合并成一个单独的时间戳。

    pd.to_datetime(data[['day', 'month', 'year']])

    完成数据列的替换

    data['new_date'] = pd.to_datetime(data[['day', 'month', 'year']]) #新产生的一列数据
    data['所属组'] = pd.to_numeric(data['所属组'], errors='coerce').fillna(0)

    到这里所有的数据列都转换完毕,最终的数据显示:


    在读取数据时就对数据类型进行转换,一步到位

    data2 = pd.read_csv("data.csv",
     converters={
     '客户编号': str,
     '2016': convert_currency,
     '2017': convert_currency,
     '增长率': convert_percent,
     '所属组': lambda x: pd.to_numeric(x, errors='coerce'),
     '状态': lambda x: np.where(x == "Y", True, False)
     },
     encoding='gbk')

    在这里也体现了使用自定义函数比lambda表达式要方便很多。(大部分情况下lambda还是很简洁的,笔者自己也很喜欢使用)

    总结

    对数据集进行操作的第一步是确保设置正确的数据类型,然后才能进行数据的分析、可视化等操作,Pandas提供了很多非常方便的函数,有了这些函数那么对数据进行分析将会是很方便的。

    热心网友 时间:2022-04-18 06:56

    我觉得有可能是因为你前面一次已经转换成功了(并保存为了文件?),第二次已经是float类型,再用replace当然就出错了
    解决方法你replace之前需要判断一下列类型,当然最好写成多个语句来实现,一个lambda里不好实现
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    橙子冷藏能保存多久 橙子会过期吗 新鲜橙子如何保存更久 橙子保鲜剂对人体有害吗 粒上皇开口熟栗120g*5袋(共600g)-详细介绍 三皇王板栗介绍 品牌榜:2024年板栗十大品牌排行榜 投票结果公布【新】 为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 深蹲时,双脚是应该八字打开还是脚尖朝前呢? 中端电脑主板华硕 微星质量哪个好? 做深蹲双腿是并拢 还是分开啊。 中端的主板选什么牌子的? 女生练深蹲时腿是分开还是并拢? 深蹲问题。 中端主板哪个比较好 解梦。 梦见,有恶魔,要毁灭世界,掌控火之本源,寒冰本源,而我又要击败恶魔,我拥有烈阳天火,玄冰真 这个梦之前好像做过,被人追杀。不同的是上次到最后死这次是梦还没结束就看到自己在飘了,好吓人 深蹲练习时两脚距离应该多宽? 小米主题商店里哪些好看的字体是免费的?!在线等!急!!! 昨天晚上做梦,我和神一起跟恶魔对抗,后来杀死了鬼, 梦见自己读佛真言对抗恶魔 自己读佛经已经几个月了!突然有一晚做梦,自... 物业装监控和道闸的费用没公示,我可以拒绝交费吗? 小区需要跟换监控,预计更换70个高清探头及整个系统,需要公示吗? 如何才能把我想听的歌曲下载到u盘中 为什么我的window7电脑每次都自动关机? 华为荣耀手机桌面时间不见了怎么设置 我想把好听的歌曲放入U盘,谁能告诉我怎么操作. 用日文翻译以下文字 崎不染是谁 崎不染(国服曜)音乐叫什么 东星耀阳多少个国服 关于王者荣耀曜的战力? 曜在哪里战力最低qq安卓 王者荣耀曜金色标第96名是谁? 王者荣耀的国服第一含金量到底有多重? 吕德华为什么有国服李白 国服校花成绩是怎么算的 上古世纪国服黑曜石7阶段怎么做 国服ICC10%BUFF什么时候能开啊 2020年报税时间最新通知 求男主江墨琛,女主叫颜夕的小说txt 先婚后爱颜夕免费阅读 连江国税局2021年第四季度零报税具体时间 为什么很多人把视频上下加黑条当做“电影感”? 怎么用索尼(sony)数码摄像机 HDR-AX2000E拍出唯美的视频来,有电影的感觉。怎么调啊?_百度问一问 怎么拍出有电影质感的视频? 如何让你拍的DV影像具有“电影感”(转) dnf手游决战、全民、最强、长久、虎啸龙吟哪个好