查看‘2004.csv’,文件前两行和第一列都是需要跳过的,使用pandas的read_csv函数的时候带上参数skiprows和usecols即可解决。而文件尾多了一行不需要的信息,使用nrows参数读取指定个数的行数即可
读取‘2004.csv’文件代码:
df = pd.read_csv('2004.csv',
encoding='gbk',
skiprows=2,
usecols=[1,2,3,4,5],
nrows=32
)
查看df的内容,发现还有许多东西需要处理:
1.第一行不需要
2.产生了NaN
对于第一个问题使用DataFrame的drop函数,对于第二个问题使用fillna函数即可
df=df.drop(index=0)
df['死亡率']=df['死亡率'].fillna(0)
现在数据已经清洗成功,还需要加上‘年份’和‘总人口数’
年份可以直接使用索引加
df['年份']=2004
总人口数需要从人口数据‘people.csv’中读取
Usecols=list(range(0,14))
people=pd.read_csv('people.csv',
encoding='gbk',
skiprows=3,
nrows=31,
usecols=Usecols
)
将人口数据加入df中,注意加入之前先将index对齐
df.index = df.index - 1
df['总人口数']=people['2004年']
到此,已经完全处理好一个csv文件
流感数据从2004-2016一共13个csv文件,需要循环读入这13个csv文件
读入13个流感数据部分代码
for i in range(2004,2017):
df = pd.read_csv('beforClearn/{}.csv'.format(i),
encoding='gbk',
skiprows=2,
usecols=[1, 2, 3, 4, 5],
nrows=32
)
最后,将DataFrame写入csv文件中,因为是连续写入,所以在to_csv函数中加上参数mode=‘a’
df.to_csv('afterClearn/result.csv',mode='a',index='False',encoding='gbk')
全部python代码:
import pandas as pd
import openpyxl
Usecols=list(range(0,14))
people=pd.read_csv('beforClearn/people.csv',
encoding='gbk',
skiprows=3,
nrows=31,
usecols=Usecols
)
people.columns=people.columns.str.replace('年','')
def cleanDate(df,year):
df = df.drop(index=0)
df.index = df.index - 1
df['死亡率']=df['死亡率'].fillna(0)
df['年份'] = year
df['总人口数']=people[year]
if int(year)==2004:
df.to_csv('afterClearn/result.csv',mode='a',index='False',encoding='gbk')
else:
df.to_csv('afterClearn/result.csv', mode='a', index='False', encoding='gbk',header=False)
if __name__ == '__main__':
df = pd.read_csv('beforClearn/2005.csv',
encoding='gbk',
skiprows=2,
usecols=[1, 2, 3, 4, 5],
nrows=32
)
cleanDate(df,str(2005))