简介
我有一个Excel表格,第一行和第一列是相同的城市名称,用作行标题和列标题,然后现在我有不同省份不同城市鸟类迁徙的数据,这些城市名称是迁入的城市名称,城市对应文件内部是这个城市不同日期下记录的迁徙数据,数据是csv文件,csv文件包括城市,省名称,和数字:城市是从哪个城市迁入到我这个csv文件城市中。我要做的就是将这些csv文件里的数据匹配到Excel表格中。
Excel如下所示:
数据如下:
csv文件如下:
代码
# 导包
import os
from openpyxl import load_workbook
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
# 加载Excel表格,并打开存储数据的文件
ec117_file=r'D:\S\矩阵_1.xlsx'
csv_folder=r'D:\S\1'
workbook=load_workbook(ec117_file)
# 遍历csv文件夹中所有名字带有117的csv文件
with pd.ExcelWriter(r'D:\S\矩阵_1.xlsx',mode='a') as writer:
for root,dirs,files in os.walk(csv_folder):
print('1111111')
for filename in files:
if '117' not in filename:
continue
print(filename)
# 提取csv文件中的城市名字
city=filename[:-16]
column_index=None
# 获取第一个工作表
worksheet=writer.book.worksheets[0]
# 获取第一行所有单元格
first_row=worksheet[1]
for index,cell in enumerate(first_row,1):
if cell.value==city:
column_index=index
break
if column_index is None:
# 如果city不在第一行,则跳过该csv文件,继续下一个循环
continue
ec=worksheet.get_all_values()
# 将第一行作为列索引,第二行及以后作为DataFrame
df_ec=pd.DataFrame(data=ec[1:],columns=ec[0])
a_col=df_ec.iloc[:,column_index-1]
# 打开117类似csv文件
csv_file=os.path.join(root,filename)
df_csv=pd.read_csv(csv_file,header=0,index_col=None,encoding='gb2312')
df_city_value=df_csv.iloc[:,[0,2]]
for i in range(len(df_csv)):
name,value=df_city_value.iloc[i]
if name in a_col.index:
a_col.loc[name]=value
else:
a_col.loc[name]=0
miss_city=set(a_col.index)-set(df_city_value.iloc[:,0])
for city in miss_city:
a_col.loc[city]=0
# 奖处理过的数据添加到DataFrame中
print('!')
writer.save()
print('2222222222') # 单纯为了显示运行到哪一步了
遇到一个花了挺长时间解决的问题是它只能保存最后一个csv文件的内容,就导致出现了整个Excel表格中只有一列有数据,最后用with pd.ExcelWriter(r’D:\S\矩阵_1.xlsx’,mode=‘a’) as writer 解决
还有一个缺点,匹配的时间很长,跑一次大概有300的csv文件需要匹配,需要大概半个小时的时间,希望有大佬可以指点一下,或者有其他有问题的地方欢迎指正!