数据清洗(根据元素匹配选取数据)

解决问题

本质是根据一个表格中的列元素将另外一个表格中的各个行的数据进行分离。

此处给出具体化实例,实例为2021泰迪杯数据挖掘大赛A题,数据与代码将在GitHub给出https://github.com/xiaolingwei/Data-cleaning_TID
根据附件1.csv文件中的股票代码选中附件2.csv中的每行数据。(即根据所属行业将数据分离)

附件1,附件2形式如下
附件1:
在这里插入图片描述
附件2:
在这里插入图片描述
红色框中的TICKER_SYMBOL即为附件1中的股票代码,附件2中每行代表一个样本数据,我们需要做的就是根据所属行业将这些样本按行业分类。

代码如下:

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
# 读入样本数据
data = pd.read_csv('附件2.csv')
# 读取不同行业的股票代码
code = pd.read_excel('附件1.xlsx')

#所属行业的集合
area_set = set(code.所属行业)

data_dict = dict()
code_dict = dict()
for x in area_set:
     code_dict.update({x:code[code.所属行业 == x].股票代码})  
     df1 = data.drop(data.index)
     for y in code_dict[x]:  # 逐个取某行业的股票代码
         y = round(y)
         df1 = df1.append(data.loc[data['TICKER_SYMBOL']== y], ignore_index = True)
     data_dict.update({x:df1})
     df1.to_csv( x +'.csv')
  1. 首先是数据清洗常用的pandasnumpy库,以及机器学习sklearn库会用到一些数据预处理的函数。
  2. 接下来是分别读取附件1,附件2的数据,使用pd.read_csv()函数,函数如何用在上篇文章说过了https://blog.csdn.net/qq_37207042/article/details/116426473
  3. 再接下来需要建立一个包含所有行业的集合,利用了集合没有重复元素的特点,对附件1的所属行业列进行集合运算。得到这样的结果:
    在这里插入图片描述
data_dict = dict()
code_dict = dict()

通过上述代码建立字典,data_dict用来保存每个行业的DataFramecode_dict 用来保存每个行业的股票代码。
最终效果是这样:
code_dict
在这里插入图片描述
data_dict
在这里插入图片描述
5.

 for x in area_set:
     code_dict.update({x:code[code.所属行业 == x].股票代码})  
     df1 = data.drop(data.index)
     for y in code_dict[x]:  # 逐个取某行业的股票代码
         y = round(y)  # 由于某些整数数据读入变成了浮点类型,此处转换为整型
         df1 = df1.append(data.loc[data['TICKER_SYMBOL']== y], ignore_index = True)
     data_dict.update({x:df1})
     df1.to_csv( x +'.csv')

上述代码外循环是对所有行业进行循环,内循环是对某个行业的所有股票代码进行循环。

5.1,

code_dict.update({x:code[code.所属行业 == x].股票代码})

是将某个行业的所有股票代码用键值对存入字典,其中{x:code[code.所属行业 == x].股票代码}x为键,code[code.所属行业 == x].股票代码为值,其中用到了列表表达式,取所属行业为x的股票代码。

5.2, 由于我们需要一个空容器,用来存储按行业分类取出的样本,这个容器需要保留样本的列名,所以采取下面的代码方法:

df1 = data.drop(data.index)  #  即删除所有数据行,保留列名 ,DataFrame格式

5.3,

df1 = df1.append(data.loc[data['TICKER_SYMBOL']== y], ignore_index = True)`

通过DataFrame的添加数据函数append()按行添加数据,data.loc[data['TICKER_SYMBOL']== y]同样采用了列表表达式,其中data.loc[]是根据行名或者列名定位的函数,[ ]中的表达式data['TICKER_SYMBOL']== y执行的结果是得到满足等式的index索引值,即在本代码中是根据行名(index)定位,以达到当data中的'TICKER_SYMBOL'列元素等于y时则取出此行的效果。

data['TICKER_SYMBOL']== y的执行结果为一个序列数据,满足表达式的值为 True ,其他为 False :
在这里插入图片描述
在这里插入图片描述

5.4,当此行业所有样本都添加进df1时,循环结束,

 data_dict.update({x:df1})
 df1.to_csv( x +'.csv')

将其存入字典,并输出表格文件。

最后输出的文件如下:
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值