实例演示:
1.将一个大Excel等份拆成多个Excel
2.将多个小Excel合并成一个大Excel并标记来源
#本节课的数据目录work_dir
work_dir='./course_datas/c15_excel_split_merge'
#work_dir下面的splits目录,来放置拆分后的小文件
splits_dir=f'{work_dir}/splits'
import os
#如果splits_dir目录不存在就创建一个小目录
if not os.path.exists(splits_dir):
os.mkdir(splits_dir)
import pandas as pd
df_source=pd.read_excel(f'{work_dir}/crazyant_blog_articles_source.xlsx')
df_source.head()
df_source.index
df_source.shape
total_row_count=df_source.shape[0]
total_row_count
1.使用df.iloc方法,将一个人的dataframe,拆分成多个小dataframe
2.将使用dataframe.to_excel保存每个小Excel
#将一个大的EXCEL文件拆分给这几个人
user_name=['xiaohu','xiaoshuai','xiaolan','xiaofan','xiaok','xiaom']
#每个人的任务数目
splits_size=total_row_count//len(user_name)
#判断每个人分配的任务数是否为整数,若不为整数则+1
if total_row_count % len(user_name) !=0:
splits_size+=1
splits_size
#将拆出来的小的dataframe存在df_sub[]当中
df_subs=[]
for index,user_name in enumerate(user_name):
#iloc的开始索引,从0开始进行索引
begin=index*splits_size
#iloc的结束索引
end=begin+splits_size
#实现df按照iloc拆分
df_sub=df_source.iloc[begin:end]
#将每个子df存入列表
df_subs.append((index,user_name,df_sub))
for index,user_name,df_sub in df_subs:
file_name=f'{splits_dir}/crazyant_blog_articles_{index}_{user_name}.xlsx'
df_sub.to_excel(file_name,index=False)
1.遍历文件夹,得到要合并的Excel文件列表
2.分别读取到dataframe,给每个df添加—列用于标记来源
3.使用pd.concat进行df批量合并
4.将合并后的dataframe输出到excel
import os
excel_names=[]
for excel_name in os.listdir(splits_dir):
excel_names.append(excel_name)
excel_names
#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
df_list=[]
for excel_name in excel_names:
#将每个excel读取到df当中
excel_path=f'{splits_dir}/{excel_name}'
df_split=pd.read_excel(excel_path)
#得到username
username=excel_name.replace('crazyant_blog_articles_','').replace('.xlsx','')[2:]
print(excel_name,username)
#给每个df添加1列,即用户名字
df_split['username']=username
df_list.append(df_split)
df_merged=pd.concat(df_list)
df_merged.shape
df_merged.head()
df_merged['username'].value_counts()
df_merged.to_excel(f'{work_dir}/crazyant_blog_articles_merged.xlsx',index=False)