问题
在利用pandas进行数据处理的过程中,遇到一列数据为列表类型,想要将数据拿到。
利用split进行分割有点墨迹,找到一种更好的办法来对数据进行处理,记录一下
数据
需要处理的数据如下
![](https://img-blog.csdnimg.cn/img_convert/a0c3e819430b7b44204c70ced4475188.png)
待处理的数据
数据处理
数据为爬取的图书销售数据,在价格一列是列表的类型,但实际类型是object类型
import pandas as pd
df_data = pd.read_csv('result.csv')
print(df_data["价格"])
输出:
0 ['¥134.10']
1 ['¥26.00']
2 ['¥35.60']
3 ['¥55.00']
4 ['¥34.00']
...
21021 ['¥55.10']
21022 ['¥134.30']
21023 ['¥74.10']
21024 ['¥168.30']
21025 ['¥17.10']
Name: 价格, Length: 21026, dtype: object
首先将列中的每个列表字符串转化为列表格式,即将‘['¥10.30']’转化为['¥10.30']
df_data["价格"]=df_data["价格"].apply(eval)
利用apply对每一行数据进行eval操作,自动适配类型,结果如下:
0 [¥134.10]
1 [¥26.00]
2 [¥35.60]
3 [¥55.00]
4 [¥34.00]
...
21021 [¥55.10]
21022 [¥134.30]
21023 [¥74.10]
21024 [¥168.30]
21025 [¥17.10]
Name: 价格, Length: 21026, dtype: object
然后将列表格式的列进行拆分,拆分结果为一个元素一列,即将‘['¥10.30,'10.2']’转化为¥10.30 10.2
df_data=df_data.explode("价格")
print(df_data["价格"])
输出结果如下:
0 ¥134.10
1 ¥26.00
2 ¥35.60
3 ¥55.00
4 ¥34.00
...
21021 ¥55.10
21022 ¥134.30
21023 ¥74.10
21024 ¥168.30
21025 ¥17.10
Name: 价格, Length: 21026, dtype: object
其他数据处理
顺便介绍一下其他列的数据处理方法
1、去空
去空分为dropna和drop两种:
#去除价格为空的行
df_data=df_data.dropna(subset=['价格'])
df_data=df_data.drop(df_data[df_data['评论数']==''].index)
2、类型转换
应用astype函数:
# #转化列的类型
# df_data['价格']=df_data['价格'].astype(float)
3、分割字符串
分割字符串并获取到第一位
df_data['出版时间']=df_data['出版时间'].str.split('-',expand=True)[0]
结果
最后是处理后的数据
![](https://img-blog.csdnimg.cn/img_convert/33b43f1771305506361c16b5bcac0061.png)
完整代码:
import pandas as pd
df_data = pd.read_csv('result.csv')
print(df_data["价格"])
#将列中的每个列表字符串转化为列表格式,即将‘['¥10.30']’转化为['¥10.30']
df_data["价格"]=df_data["价格"].apply(eval)
print(df_data["价格"])
#将列表格式的列进行拆分,拆分结果为一个元素一列,即将‘['¥10.30,'10.2']’转化为¥10.30 10.2
df_data=df_data.explode("价格")
print(df_data["价格"])
df_data['价格']=df_data['价格'].str.replace('¥','')
df_data['价格']=df_data['价格'].str.replace(',','')
df_data['评论数']=df_data['评论数'].str.replace('条评论','')
df_data['推荐度']=df_data['推荐度'].str.replace('%推荐','')
#去除价格为空的行
df_data=df_data.dropna(subset=['价格'])
df_data=df_data.drop(df_data[df_data['评论数']==''].index)
#转化列的类型
df_data['价格']=df_data['价格'].astype(float)
#分割字符串并获取到第一位
df_data['出版时间']=df_data['出版时间'].str.split('-',expand=True)[0]
print(df_data["价格"])
df_data.to_csv('clean.csv')
有不足之处希望可以有大佬指点