Loading... # a. 列出文件夹下的内容 ```python #【提示】 #该写法是我百度“python列出文件夹下的文件”找到的: # os.listdir(path) 可以列出path目录中的文件名、子文件夹名 #对于课程外的特殊用法可以用百度来查找,然后在Python IDLE上去help()它的用法 import os #导入os(操作系统)模块 help(os.listdir) #查看os的listdir函数说明 print(os.listdir('../原始表格'))#试用,打印它的结果看看;这里..指该程序所在目录的上一级目录 ``` # b. 遍历一个列表 ```python #【提示】 #学习新语句时要仔细观察它。 #当你自己仿写出错时,要仔细与正确的写法做对比。 import os for file_name in os.listdir('../原始表格'): print(file_name) #一对'''表示注释一段 ''' 基本语法: for 变量名 in 列表名: 循环体 【注意】程序类似自然语言的表述,该for循环语句表示: 对于列表中的每一个元素,将其放入该变量中,然后执行一次循环体的语句 注意:循环体中的每一条语句前面都要按一下Tab键来缩进。 ''' ``` # c. 读取excel文件到df ```python #【重要提示:边写边测试】将测试无误的语句组合成程序。 # import pandas as pd excel_file = pd.io.excel.ExcelFile(r"../原始表格/201801公积金.xlsx") print('excel_file的类型: ', type(excel_file), '\n') #'\n'是换行符 #sheet_names是pandas.io.excel.ExcelFile对象的一个属性 print('excel_file.sheet_names:', excel_file.sheet_names, '\n')#你可以打印任何你感兴趣的变量看看。 for sheet_name in excel_file.sheet_names: #谨慎起见,我们取得excel文件中的每个sheet fund_df = pd.read_excel(excel_file, sheet_name) print('fund_df的类型: ', type(fund_df))#需要常看变量的类型,以确定它的操作方法 print(fund_df) #出乎意料,打印发现有2个Empty DataFrame,由于该excel文件的Sheet2和Sheet3是空的 #这里再次看到了初学者做“边写边测试”的重要性。如若不然,当你把程序写完后再测试,很可能会出很多意料不到的错误。 ``` # d. 判断空df ```python #接上一个程序。 #【重要提示】学写新用法的过程无非是:1. 查找语句;2. 上机试验+使用help;3. 将其写进程序中。 import pandas as pd excel_file = pd.io.excel.ExcelFile(r"../原始表格/201801公积金.xlsx") for sheet_name in excel_file.sheet_names: #谨慎起见,我们取得excel文件中的每个sheet fund_df = pd.read_excel(excel_file, sheet_name) #如何判断一个dataframe是空的呢? #我百度了一下“判断 空的dataframe”,查找到DataFrame对象的empty属性(打印看到它的值为True或False) if fund_df.empty == False: #这是if分支语句,当if后的条件为True时,执行if下面的语句序列(需Tab键缩进) print('fund_df:\n', fund_df) print('fund_df.shape:', fund_df.shape) #很有用的一个用法,取得维度。 print('fund_df的行数:', fund_df.shape[0]) print('fund_df的列数:', fund_df.shape[1]) else: #else分支可以不加 print('对空DataFrame不做处理。') ``` # e. 增加年月列 ```python #【编程提示】先思路,再代码。初学者可以将思路一步步写下来,细化,然后“翻译”成代码。 #【进入核心】参考:03.10-处理时间序列 import pandas as pd excel_file = pd.io.excel.ExcelFile(r"../原始表格/201801公积金.xlsx") for sheet_name in excel_file.sheet_names: #谨慎起见,我们取得excel文件中的每个sheet fund_df = pd.read_excel(excel_file, sheet_name) if fund_df.empty == False: #【目标】下面增加一个日期列,每个元素是同一个日期2018年1月 #【思路】 #列表的小技巧: print(['2018-01']*fund_df.shape[0]) #*号将列表['2018-01']拷贝数次,形成一个新列表 print(pd.to_datetime(['2018-01']*fund_df.shape[0]))#将字符串列表转换为DatetimeIndex列表 print(pd.to_datetime(['2018-01']*fund_df.shape[0]).to_period('M'))#将DatetimeIndex列表转换为PeriodIndex类型,频率为月 fund_df['年月'] = pd.to_datetime(['2018-01']*fund_df.shape[0]).to_period('M')#新增一列fund_df['年月'] print('fund_df[\'年月\']:\n', fund_df['年月'])#''是字符串的定界符,在字符串中打印'本身使用转义字符:\' print('fund_df:\n', fund_df) ``` # f. 将年月列放在最左边 ```python # 接上个程序,将日期列放在最左边。 #参考:03.03-数据取值与选择 import pandas as pd excel_file = pd.io.excel.ExcelFile(r"../原始表格/201801公积金.xlsx") for sheet_name in excel_file.sheet_names: #谨慎起见,我们取得excel文件中的每个sheet fund_df = pd.read_excel(excel_file, sheet_name) if fund_df.empty == False: #【改进目标】将日期列放在最左边 old_columns = list(fund_df.columns) #保存旧的列,list函数将其转换为普通列表 print('旧列名的列表:', old_columns) new_columns = ['年月'] + old_columns #+连接两个列表,将'年月'放在前面 print('新列名的列表:', new_columns) fund_df['年月'] = pd.to_datetime(['2018-01']*fund_df.shape[0]).to_period('M')#新增一列fund_df['年月'] fund_df = fund_df.loc[:, new_columns] #利用显示索引器,取得新顺序的列明,再赋给fund_df print('fund_df (年月这列在前):\n', fund_df) ``` # g. 保存df到excel文件 ```python # 接上个程序,保存df到excel文件。 import pandas as pd excel_file = pd.io.excel.ExcelFile(r"../原始表格/201801公积金.xlsx") for sheet_name in excel_file.sheet_names: #谨慎起见,我们取得excel文件中的每个sheet fund_df = pd.read_excel(excel_file, sheet_name) if fund_df.empty == False: #增加'年月'列名,放在最左边 old_columns = list(fund_df.columns) #保存旧的列,list函数将其转换为普通列表 print('旧列名的列表:', old_columns) new_columns = ['年月'] + old_columns #+连接两个列表,将'年月'放在前面 print('新列名的列表:', new_columns) #新增'年月'列到df fund_df['年月'] = pd.to_datetime(['2018-01']*fund_df.shape[0]).to_period('M')#新增一列fund_df['年月'] fund_df = fund_df.loc[:, new_columns] #利用显示索引器,取得新顺序的列明,再赋给fund_df print('fund_df (年月这列在前):\n', fund_df) #保存到excel(百度:dataframe保存到excel ) writer=pd.ExcelWriter(r"./新表格/201801公积金新.xlsx") #.表示当前目录,设置保存到该程序所在的当前目录下的“新表格”子文件夹(需事先手工创建,你可以百度一下怎么用程序创建) fund_df.to_excel(writer, 'Sheet1', index=False) #index=False将不保存index writer.save() #保存到CSV文件中,亲测速度快得多! fund_df.to_csv(r"./新表格/201801公积金新.csv", encoding='utf_8_sig')#encoding参数指定字符编码是'utf_8_sig',否则会出现乱码(解决乱码一般百度一下即可) ``` # h. 组合b和g,按行合并多文件 ```python # 将以上程序提供的功能进行组合:读取原始表格中的所有月份的公积金数据,然后连接成一个新表。 #参考:03.07-按行合并数据集: concat与append操作 import os import pandas as pd all_fund_df = pd.DataFrame() #创建一个空df,用于存储所有df for file_name in os.listdir('../原始表格'): #对所有文件做循环 #【以下拷贝g程序的主要代码,然后按Tab缩进于上一句for循环下,然后改写它】 if '公积金' not in file_name or file_name.endswith('.xlsx') == False: #如果file_name中不包含'公积金'或者它不是excel文件,则不处理该文件 continue #该语句意思是它下面的代码,继续下一次循环 excel_file = pd.io.excel.ExcelFile(r'../原始表格/' + file_name) #+为连接两个字符串 #提取字符串小技巧: year = file_name[0:4]#字符串第0-3位是年 month = file_name[4:6]#字符串第4-5位是月 for sheet_name in excel_file.sheet_names: #对每个sheet做循环 fund_df = pd.read_excel(excel_file, sheet_name) if fund_df.empty == False: #增加'年月'列名,放在最左边 old_columns = list(fund_df.columns) new_columns = ['年月'] + old_columns #新增'年月'列到df fund_df['年月'] = pd.to_datetime([year+'-'+month]*fund_df.shape[0]).to_period('M') #年月是字符串year+'-'+month #合并到all_fund_df中 all_fund_df = pd.concat([all_fund_df, fund_df.loc[:, new_columns]], ignore_index=True) #外循环结束,输出结果(注意:以下语句与外循环的for缩进相同) print(all_fund_df) all_fund_df.to_csv(r"./新表格/所有公积金.csv", encoding='utf_8_sig') ``` # i. 适当增加注释,提高程序的可读性 ```python # 接上一个程序 # 适当增加注释,增加可读性;不同功能段的程序之间用空行分隔 import os import pandas as pd all_fund_df = pd.DataFrame() for file_name in os.listdir('../原始表格'): #外循环:对所有文件做循环 if '公积金' not in file_name or file_name.endswith('.xlsx') == False: #以下只处理公积金数据 continue excel_file = pd.io.excel.ExcelFile(r'../原始表格/' + file_name) #+为连接两个字符串 #从文件名字符串里提取年和月 year = file_name[0:4] month = file_name[4:6] for sheet_name in excel_file.sheet_names: #内循环:对每个sheet做循环 fund_df = pd.read_excel(excel_file, sheet_name) if fund_df.empty == False: #增加'年月'列名,放在最左边 old_columns = list(fund_df.columns) new_columns = ['年月'] + old_columns #新增'年月'列到df fund_df['年月'] = pd.to_datetime([year+'-'+month]*fund_df.shape[0]).to_period('M') #年月是字符串year+'-'+month #合并到all_fund_df中 all_fund_df = pd.concat([all_fund_df, fund_df.loc[:, new_columns]], ignore_index=True) #外循环结束,输出结果 print(all_fund_df) all_fund_df.to_csv(r"./新表格/所有公积金.csv", encoding='utf_8_sig') ``` # j. 关于按列合并 ```python #按列合并merge支持以多字段为基准的连接 #示例: import pandas as pd df1 = pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6], 'C':[7, 8, 9]}) df2 = pd.DataFrame({'A':[1, 2, 3], 'B':[1, 2, 6], 'C':[70, 80, 90]}) print('df1:\n', df1) print('df2:\n', df2) df12 = pd.merge(df1, df2, left_on=['A', 'B'], right_on=['A', 'B']) print('内连接:\n', df12) #此外,应考虑因离职或记录有误,比如,有的员工当月缴纳了保险,但没有缴纳公积金。 #此时,使用外连接 #参考:03.08-按列合并数据集: merge操作 df12 = pd.merge(df1, df2, left_on=['A', 'B'], right_on=['A', 'B'], how='outer') print('外连接:\n', df12) ``` # 案例文件: <div class="hideContent">此处内容需要评论回复后(审核通过)方可阅读。</div> 最后修改:2023 年 02 月 15 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏