看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在数据分析过程中,有时需要先对数据进行格式转换,比如本案例中数字带有万、亿等单位,它实质上是一个字符串,无法参与统计计算,因此我们先要将它们转换为数字类型。一起来看看 pandas
是如何操作的。
以下是源数据:
from io import StringIO
import pandas as pd
data = '''
代码 名称 金额
0 300057 万顺新材 5.90亿
1 2758 浙农股份 4.62亿
2 603007 ST花王 2241万
3 2707 众信旅游 4.00亿
4 603617 君禾股份 3206万
5 2873 新天药业 4.05亿
'''
df = pd.read_csv(StringIO(data), sep=r'\s+')
df
# ...
金额列带有万、亿等单位,需要转换为整型数字,接下来分析一下解决思路。
可以写一个函数来处理,传入的是一个字符串,输出一个整型的数字,最后用一列的 map() 方法映射调用这个方法。
字符串中将万、亿分别替换为科学计数法的 e4 和 e8,形成了数字的科学计算法字面量,如字符串 5.90e8,然后用 Python 内置函数 eval() 来转换为 Python 对象,即数字类型。
根据思路,我们的处理函数如下:
def func(money: str) -> int:
foo = money.replace('万', 'e4').replace('亿', 'e8')
foo = eval(foo)
return int(foo)
调用这个函数并覆盖原列:
df.assign(金额=df.金额.map(func))
'''
代码 名称 金额
0 300057 万顺新材 590000000
1 2758 浙农股份 462000000
2 603007 ST花王 22410000
3 2707 众信旅游 400000000
4 603617 君禾股份 32060000
5 2873 新天药业 405000000
'''
df.assign(金额=df.金额.map(func)).dtypes
'''
代码 int64
名称 object
金额 int64
dtype: object
'''
也可以用链式方法一一处理:
(
df.assign(金额=df.金额.str.replace('万', 'e4'))
.assign(金额=lambda d: d.金额.str.replace('亿', 'e8'))
.assign(金额=lambda d: d.金额.map(eval))
.astype({'金额': int})
)
# ... <略,正确的结果>
这样就完成了需求。
(完)
更新时间:2024-08-18 16:08:20 标签:pandas python 数字 整型