解决问题
本质是根据一个表格中的列元素将另外一个表格中的各个行的数据进行分离。
此处给出具体化实例,实例为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')
- 首先是数据清洗常用的
pandas
,numpy
库,以及机器学习sklearn
库会用到一些数据预处理的函数。 - 接下来是分别读取附件1,附件2的数据,使用
pd.read_csv()
函数,函数如何用在上篇文章说过了https://blog.csdn.net/qq_37207042/article/details/116426473。 - 再接下来需要建立一个包含所有行业的集合,利用了集合没有重复元素的特点,对附件1的所属行业列进行集合运算。得到这样的结果:
data_dict = dict()
code_dict = dict()
通过上述代码建立字典,data_dict
用来保存每个行业的DataFrame
,code_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')
将其存入字典,并输出表格文件。
最后输出的文件如下: