pandas处理读取文件时以0开头的缺失问题 symbol 000001 被省略

在读取平安银行的利润表.xlsx文件时,股票代码被识别为int64,但应保持为字符串。提出了两种解决方案:一是将所有数据类型转为object,二是使用apply填充方法确保股票代码为固定长度。这两种方法都能解决数据类型问题,但在数据分析前可能需要进一步处理datetime数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在读文件,平安银行的利润表.xlsx为例,symbol 是股票代码,源数据为:
在这里插入图片描述
直接用read_excel读取的数据为:

股票简称          object
股票代码           int64
字段            object
2021-03-31    object
2020-12-31    object
2020-09-30    object
2020-06-30    object
2020-03-31    object
dtype: object

    股票简称  股票代码                字段  ...   2020-09-30   2020-06-30  2020-03-31
0   平安银行     1            一、营业收入  ...  12719000.00   8468000.00  4178800.00
1   平安银行     1             利息净收入  ...   8956100.00   5936100.00  2976600.00
2   平安银行     1           其中:利息收入  ...  15868700.00  10483200.00  5207400.00
3   平安银行     1            减:利息支出  ...   6912600.00   4547100.00  2230800.00
4   平安银行     1         手续费及佣金净收入  ...   2543900.00   1739800.00   848100.00
5   平安银行     1       其中:手续费及佣金收入  ...   3078900.00   2068800.00  1073300.00
6   平安银行     1        减:手续费及佣金支出  ...    535000.00    329000.00   225200.00
7   平安银行     1              汇兑收益  ...     99300.00     50500.00    50300.00
8   平安银行     1             投资净收益  ...    936700.00    596300.00   275700.00
9   平安银行     1     其中:对联营公司的投资收益  ...           --           --          --
10  平安银行     1         公允价值变动净收益  ...    150200.00    121500.00    17600.00
11  平安银行     1            其他业务收入  ...     10800.00      7600.00     2400.00
12  平安银行     1            二、营业支出  ...   3659900.00   2398000.00  1216200.00
13  平安银行     1           营业税金及附加  ...    122900.00     82000.00    41200.00
14  平安银行     1           业务及管理费用  ...   3537000.00   2316000.00  1175000.00

股票代码,应该为000001, 在读的时候,pandas转成了int64,目前只找到下面两种解决方案。

解决方案一:全部转成字符串

对读取的文件,不管是什么类型的数据,全部转成object

import pandas as pd
filepath = "lr_000001.xlsx"  # 文件路径,字符串
sheet_name = 0  # sheet名, 整数
header = 0  # 行索引, 整数
index_col = 0  # 列索引,整数
frame = pd.read_excel(filepath, sheet_name=sheet_name, header=header, index_col=index_col,dtype=object)
print(frame.dtypes)
print(frame.columns)
print(frame)

输出结果为:

股票代码          object
字段            object
2021-03-31    object
2020-12-31    object
2020-09-30    object
2020-06-30    object
2020-03-31    object
dtype: object
Index(['股票代码', '字段', '2021-03-31', '2020-12-31', '2020-09-30', '2020-06-30',
       '2020-03-31'],
      dtype='object')
        股票代码                字段  ...   2020-06-30  2020-03-31
股票简称                            ...                         
平安银行  000001            一、营业收入  ...   8468000.00  4178800.00
平安银行  000001             利息净收入  ...   5936100.00  2976600.00
平安银行  000001           其中:利息收入  ...  10483200.00  5207400.00
平安银行  000001            减:利息支出  ...   4547100.00  2230800.00
平安银行  000001         手续费及佣金净收入  ...   1739800.00   848100.00
平安银行  000001       其中:手续费及佣金收入  ...   2068800.00  1073300.00
平安银行  000001        减:手续费及佣金支出  ...    329000.00   225200.00
平安银行  000001              汇兑收益  ...     50500.00    50300.00
平安银行  000001             投资净收益  ...    596300.00   275700.00
平安银行  000001     其中:对联营公司的投资收益  ...           --          --

这样的数据,如果要做数据分析,就必选先转数据类型,特别是datatime类型的数据

解决方案二:填充,但是这种填充,也会有问题,不确定要填充的位数,有些股票代码只有5位

pandas中使用的是apply填充 : 0>6d的意思是补成六位,用0补,>是向左补,

#  pandas 的 apply() 函数可以作用于 Series 或者整个 DataFrame,
# 功能也是自动遍历整个 Series 或者 DataFrame, 对每一个元素运行指定的函数。
# 最后使用匿名函数格式化数据,就得到想要的结果
frame['股票代码'] =  frame['股票代码'].apply(lambda x:'{:0>6d}'.format(x))
print(frame)
        股票代码                字段  ...   2020-06-30  2020-03-31
股票简称                            ...                         
平安银行  000001            一、营业收入  ...   8468000.00  4178800.00
平安银行  000001             利息净收入  ...   5936100.00  2976600.00
平安银行  000001           其中:利息收入  ...  10483200.00  5207400.00
平安银行  000001            减:利息支出  ...   4547100.00  2230800.00
平安银行  000001         手续费及佣金净收入  ...   1739800.00   848100.00
平安银行  000001       其中:手续费及佣金收入  ...   2068800.00  1073300.00

还有一种是填充字符串的,使用 zfill()方法 :zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。在输出一些编号类型的数字时,往往需要前面补0,比如这样的数字:

serial_num = 15
 
serial_num  = str(serial_num).zfill(6)
 
print(serial_num )
 
输出结果:000015
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值