今天在对爬下来的数据进行处理的时候,遇到一个问题,就是我想将dataframe里面某一列类型从list转换为int,即以下形式:
##['238分钟'] -> 238
就出现了一系列匪夷所思的问题,真的让我焦头烂额,这里先感谢一下岚哥,帮我debug了一下查出了错误(真的,程序员确实要学会自己找错误哈哈哈。)
首先,第一步当然是要把中文字给他去掉,然后只保留数字,运行下面代码即可实现:
pattern = '\d+'#只要数字
import re
data_item['runtime'] = data_item['runtime'].astype(str).str.findall(pattern)
这样,我们就可以把结果转换成:
##['238分钟'] -> ['238']
第二步,我这里的思路是将这一列表里的值先取出来,转换成int类型,然后赋值给原来的变量。话不多说,have a try:
data_item.runtime = data_item.runtime.apply(lambda y: ['0'] if len(y)==0 else y)
for i in range(len(data_item)):
data_item['runtime'][i] = pd.to_numeric(data_item['runtime'][i][0]).tolist()
三行代码,也就花了三天吧......
讲一下代码的来历。
根据上述的思路,那么首先最简单能想到的就是直接来一个遍历。
for i in range(len(data_item)):
data_item['runtime'][i] = pd.to_numeric(data_item['runtime'][i][0]).tolist()
简单说一下函数的调用。
pd.to_numeric()
pandas.to_numeric(arg, errors='raise', downcast=None)
将参数转换为数字类型。
默认返回
dtype
为float64
或int64
, 具体取决于提供的数据。
df.tolist()
Pandas的
tolist()
函数用于将一个系列或数据帧中的列转换为列表。
没错,这个时候未知错误出现了......
##列表超出范围
IndexError: list index out of range
没关系,我们不妨debug一下,加一个输出
for i in range(len(data_item)):
data_item['runtime'][i] = pd.to_numeric(data_item['runtime'][i][0]).tolist()
print(i)
结果如下:
0
1
2
3
4
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_20556/2781337417.py in <module>
22 # data_item.runtime = data_item.runtime.apply(lambda y: ['0'] if len(y)==0 else y)
23 for i in range(len(data_item)):
---> 24 data_item['runtime'][i] = pd.to_numeric(data_item['runtime'][i][0]).tolist()
25 print(i)
26 # data_item['runtime'][i] = data_item['runtime'][i][0].astype('int64')
IndexError: list index out of range
我们不难发现,i到4就停止了,经过查询后发现,真相只有一个,data_item['runtime'][5]是个空的。
好吧,那么接下来就是要对缺失值进行补全,这里将所有缺失值补充为0
data_item.runtime = data_item.runtime.apply(lambda y: ['0'] if len(y)==0 else y)
补全之后,重新运行代码,结果如下
0 114
1 114
2 83
3 165
4 90
...
11784 14
11785 108
11786 96
11787 15
11788 66
Name: runtime, Length: 11789, dtype: object
成功!