Python新冠疫情案例_01合并Excel文件

注:本篇文章以新冠疫情数据文件的合并为例。
需要相关数据的请移步:》2020-2022年新冠疫情数据


一、单目录下面的数据合并

在这里插入图片描述

将2020下的所有文件进行合并,成一个文件:

import requests
import json
import openpyxl
import datetime
import datetime as dt
import time
import pandas as pd
import csv
from openpyxl import load_workbook
from sqlalchemy import create_engine
import math
import os
import glob
csv_list=glob.glob(r'D:\Python\03DataAcquisition\COVID-19\2020\*.csv')
print("所有数据文件总共有%s" %len(csv_list))
for i in csv_list:
    fr=open(i,"rb").read() #除了第一个数据文件外,其他不读取表头
    with open('../output/covid19temp0314.csv','ab') as f:
        f.write(fr)
    f.close()
print('数据合成完毕!')

在这里插入图片描述

合并后的数据:
在这里插入图片描述

二、使用函数进行数据合并

## 02 使用函数进行数据合并
import os
import pandas as pd 
# 定义函数(具有递归功能)
def mergeFile(parent,path="",pathdeep=0,filelist=[],csvdatadf=pd.DataFrame(),csvdata=pd.DataFrame()):
    fileAbsPath=os.path.join(parent,path)
    if os.path.isdir(fileAbsPath)==True:
        if(pathdeep!=0 and ('.ipynb_checkpoints' not in str(fileAbsPath))): # =0代表没有下一层目录
            print('--'+path)
        for filename2 in os.listdir(fileAbsPath):
            mergeFile(fileAbsPath,filename2,pathdeep=pathdeep+1)
    else:
        if(pathdeep==2 and path.endswith(".csv") and os.path.getsize(parent+'/'+path)>0):
            filelist.append(parent+'/'+path)
    return filelist

# D:\Python\03DataAcquisition\COVID-19
path=input("请输入数据文件所在目录:")
filelist=mergeFile(path)

filelist

csvdata=pd.DataFrame()
csvdatadf=pd.DataFrame()

for m in filelist:
    csvdata=pd.read_csv(m,encoding='utf-8-sig')
    csvdatadf=csvdatadf.append(csvdata)
# 由于2023年的数据还没有,所以不合并

在这里插入图片描述

(* ̄(oo) ̄)注: 这个的等待时间应该会比较长,因为一共有一百九十多万条数据。

将合并后的数据进行保存:

csvdatadf.to_csv("covid190314.csv",index=None,encoding='utf-8-sig')
csvdatadf=pd.read_csv("covid190314.csv",encoding='utf-8-sig')
csvdatadf.info()

在这里插入图片描述

读取新冠疫情在2020/0101之前的数据:

beforedf=pd.read_csv(r'D:\Python\03DataAcquisition\COVID-19\before20201111.csv',encoding='utf-8-sig')
beforedf.info()

在这里插入图片描述

在这里插入图片描述

将两组数据合并:

tempalldf=beforedf.append(csvdatadf)
tempalldf.head()

在这里插入图片描述

三、处理港澳台数据

在这里插入图片描述
如图所示:要将Country_RegionHong Kong变成China。澳门和台湾也是如此:

查找有关台湾的数据:

beforedf.loc[beforedf['Country/Region']=='Taiwan']
beforedf.loc[beforedf['Country/Region'].str.contains('Taiwan')]
beforedf.loc[beforedf['Country/Region'].str.contains('Taiwan'),'Province/State']='Taiwan'
beforedf.loc[beforedf['Province/State']=='Taiwan','Country/Region']='China'
beforedf.loc[beforedf['Province/State']=='Taiwan']

在这里插入图片描述
香港的数据处理:

beforedf.loc[beforedf['Country/Region'].str.contains('Hong Kong'),'Province/State']='Hong Kong'
beforedf.loc[beforedf['Province/State']=='Hong Kong','Country/Region']='China'
afterdf.loc[afterdf['Country_Region'].str.contains('Hong Kong'),'Province_State']='Hong Kong'
afterdf.loc[afterdf['Province_State']=='Hong Kong','Country_Region']='China'

澳门的数据处理:

beforedf.loc[beforedf['Country/Region'].str.contains('Macau'),'Province/State']='Macau'
beforedf.loc[beforedf['Province/State']=='Macau','Country/Region']='China'
afterdf.loc[afterdf['Country_Region'].str.contains('Macau'),'Province_State']='Macau'
afterdf.loc[afterdf['Province_State']=='Macau','Country_Region']='China'

最终将整理好的数据进行保存:

beforedf.to_csv("beforedf0314.csv",index=None,encoding='utf-8-sig')
afterdf.to_csv("afterdf0314.csv",index=None,encoding='utf-8-sig')

在这里插入图片描述

四、表头修改+去除空值

将生成的beforedf0314.csvafterdf0314.csv两个文件进行合并。

import pandas as pd 
beforedf=pd.read_csv("beforedf0314.csv")
afterdf=pd.read_csv("afterdf0314.csv")

beforedf的表头与第一行数据:
| Country/Region | Province/State | Latitude | Longitude |Confirmed | Recovered | Deaths | Date |
|–|–|–|–|–|–|–|–|–|
|China| Anhui| 31.825700 |117.226400| 1.0 |NaN| NaN| 2020/1/22|

afterdf的表头与第一行数据:

FIPSAdmin2Province_StateCountry_RegionLast_UpdateLatLong_ConfirmedDeathsRecoveredActiveCombined_KeyIncident_RateCase_Fatality_Ratio
NaNNaNNaNAfghanistan2020-11-1205:25:5533.93911067.70995342609158134967.06061.0Afghanistan109.454960

可以看到两者的表头不完全一致,因此想要将两者合并则必须要对表头进行相应的处理:

# 将两个数据集的属性进行统一化
beforedfv2=beforedf.rename(columns={'Country/Region':'Country_Region', 'Province/State':'Province_State', 'Latitude':'Lat', 'Longitude':'Longi',}).replace()

afterdfv2=afterdf.rename(columns={'Last_Update':'Date','Long_':'Longi'}).replace()

afterdfv2=afterdfv2[['Province_State', 'Country_Region', 'Date','Lat', 'Longi', 'Confirmed', 'Deaths', 'Recovered']]

此时表头就能对应了:
在这里插入图片描述
接下来要对于国家是空的数据进行剔除:

# 查看一下是否国家有空值
beforedfv2.loc[beforedfv2['Province_State'].isnull()]

很好,没有空值:
在这里插入图片描述

afterdfv2.loc[afterdfv2['Province_State'].isnull()]

有7条空值:
在这里插入图片描述
处理步骤:
对于国家存在空值的,可以看到其省份不是空值那就把省份的值填充到国家上面

afterdfv2.loc[afterdfv2['Province_State'].isnull(),'Province_State']=afterdfv2['Country_Region']

处理完之后检测一下:也没有空值了
在这里插入图片描述
把整理好的数据存盘:

beforedfv2.to_csv('beforedfv2.csv',encoding='utf-8-sig',index=None)
afterdfv2.to_csv('afterdfv2.csv',encoding='utf-8-sig',index=None)

五、合并数据

alldf1=beforedfv2.append(afterdfv2)

合并之后数据集的前五条:
在这里插入图片描述
合并之后数据集的后五条:
在这里插入图片描述
一共是一百九十多万条的数据。

六、合并后数据整理

# 剔除重复值
alldfnodup=alldf.drop_duplicates()
alldfnodup.to_csv("alldfnodup.csv",index=None,encoding='utf-8-sig')

删除后面的时分秒,只去日期,不取时间:
在这里插入图片描述

# 更改Date的类型
alldfnodup['Date']=pd.to_datetime(alldfnodup['Date']).dt.normalize()
# 空值填充为0
alldfnodup['Recovered'].fillna(0,inplace=True)
alldfnodup['Deaths'].fillna(0,inplace=True)
# 人数变成int64类型
alldfnodup['Recovered']=alldfnodup['Recovered'].astype('int64')
alldfnodup['Deaths']=alldfnodup['Deaths'].astype('int64')
alldfnodup['Confirmed']=alldfnodup['Confirmed'].astype('int64')
# 按照国家,省份,日期来排序
alldfsort=alldfnodup.sort_values(['Country_Region','Province_State','Date']).replace()

整理后共有280W+的数据
在这里插入图片描述

alldfsort[alldfsort['Country_Region']=='China']

其中中国的数据:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温欣2030

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值