#导入相应模块
import re
import os
import pandas as pd
import numpy as np
# 读取 10个csv 文件
path = 'E:/round1/'
files = os.listdir(path)
files_csv = list(filter(lambda x: x[-4:]=='.csv' , files))
#定义一个空列表
data_list = []
#函数re.compile将正则表达式(以字符串书写的)转换为模式对象
num_filter = re.compile(r'\d+')
# 循环读取文件中‘code','close'两列,并添加一列'rank'
for file in files_csv:
tmp = pd.read_csv(path + file)[['code', 'close']]
tmp['rank'] = num_filter.findall(file)[0]
data_list.append(tmp)
# 将读入的数据连接
all_data = pd.concat(data_list)
all_data.head()
# 将‘rank'一列数据赋值给all_data_rank all_data_rank = pd.to_numeric(all_data['rank']) all_data.dtypes
# 删除'rank'一列
all_data = all_data.drop('rank', axis = 1)
# 在0列插入一列'rank'值为all_data_rank的值
all_data.insert(0, 'rank', all_data_rank)
# 将数据按照'code','rank'的值排序
a = all_data.sort_values(by = ['code','rank'])
# 取code 的唯一值,并求其长度
len(a.code.unique()) # 长度为737
code = a.code.unique()
# 重复十遍,并生成列表
code = code.repeat(10)
code = code.tolist()
# 循环1~10,并重复循环737次,生成列表
x = np.arange(1,11, step = 1)
y=np.tile(x,737)
y = y.tolist()
# 以生成的两个列表生成新的数据框
y = pd.DataFrame({'rank': y,'code': code})
y.head()
# 将数据框和新生成的数据框左连接
b = pd.merge(y, a, how='left')
sum(b.isnull().values)# 查看数据框的缺失值
# 将数据根据“code”进行分组
group_rank = b.groupby(['code'])
# 分别向前先后填充缺失值
d = b.fillna(method = 'bfill',limit = 3) #用limit限制每列可以替代NaN的数目
d = d.fillna(method = 'ffill')
sum(d.isnull().values)
当数据中存在NaN缺失值时,我们可以用其他数值替代NaN,主要用到了DataFrame.fillna()方法,
使用0替代缺失值(当然你可以用任意一个数字代替NaN);
df.fillna(0)
用一个字符串代替缺失值;
df.fillna('missing')
用前一个数据代替NaN:method='pad'或者 method='ffill';
df.fillna(method='pad')
与pad相反,bfill表示用后一个数据代替NaN;df.fillna(method='pad')
这里我们增加一个知识点,用limit限制每列可以替代NaN的数目;
df.fillna(method='bfill',limit=1)
除了上面用一个具体的值来代替NaN之外,还可以使用平均数或者其他描述性统计量来代替NaN;
df.fillna(df.mean()