Python实现Excel数据分析基础
相关数据及程序下载:
链接:https://pan.baidu.com/s/1UqGERC_SfO7OObw-nx3SFw
提取码:mq0k
Excel文件内省
Excel文件(扩展名为.xls/.xlsx),与CSV文件至少有两个重要的不同点。
一,Excel文件不是纯文本文件,无法通过文本编辑器查看数据。
二,Excel工作簿被设计成多个工作表。
因此,我们需要在不打开Excel文件的前提下,通过Excel工作簿内省(内部检查),获取其中所有工作表的信息。在处理数据之前,确认使用数据就是我们所需要的。
确认工作簿中工作表的数量、名称和每个工作表中行列的数量,输入以下代码,对sales_2013文件进行检查:
#!/usr/bin/env python3
import sys
from xlrd import open_workbook
input_file = sys.argv[1]
workbook = open_workbook(input_file)
print('Number of worksheets:',workbook.nsheets)
for woksheet in workbook.sheets():
print("Worksheet name:",worksheet.name,"\tRows:",\worksheet.nraows,"\tColumns:",worksheet.ncols)
注:关于程序中sys.argv[ ]的使用参考:
https://blog.csdn.net/weixin_43754278/article/details/107620632
在cmd中,输入下入列程序:
输出如下:
通过这段程序,我们可以大概了解到Excel文件(sales_2013)中,有三个工作表,每个工作表中有7行5列。
读写Excel文件
读取Excel文件的具体解释,可以参考博客完成:
https://blog.csdn.net/weixin_43754278/article/details/107620632
这里,我们通过pandas读取sales_2013.xlsx文件中的第一个表格,january_2013,进行分析。打印出DataFrame:
Excel数据分析
接下来的例子中,我们将使用pandas库进行分析,基础python代码有兴趣的朋友可以查阅《python数据分析》。
筛选特定条件的行
目标:筛选出Sale Amount 大于$1400.00的行
使用pandas筛选出某个条件的行,可以通过判定条件迅速的选出所需要的。还可以通过逻辑顺序,进行多个条件的选择。如‘&’、‘|’等。
创建Script1.py文件,写入下列程序:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f,'january_2013',index=False)
df_condition = df[df['Sale Amount'].astype(float)>1400.0] #筛选条件
writer = pd.ExcelWriter(output_f)
df_condition.to_excel(writer,sheet_name='jan_13_output',index=False)
writer.save()
print(df_condition)
在命令行(cmd)中,对应路径下,输入py文件+读取文件+输出文件,就可以得到大于1400的行:
集合索引
行列中的值属于某个集合
目标:筛选出购买日期为01/24/2013或01/31/2013的行
pandas提供了isin()函数,通过它来检验特定值是否在列表中。
创建Script2.py文件,写入下列程序:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f,'january_2013',index_col=None)
df_condition = ['1/24/2013','1/31/2013']
get_df = df[df['Purchase Date'].isin(df_condition)]
writer = pd.ExcelWriter(output_f)
get_df.to_excel(writer,sheet_name='jan_13_output',index=False)
writer.save()
print(df['Purchase Date'])
print('-------')
print(df_condition)
print('-------')
print(df['Purchase Date'].isin(df_condition))
print('-------')
print(get_df)
分别print出的结果,不明白的地方可以对应程序,多看一下。最好动手尝试一下。
行中的值匹配特定模式
目标:筛选出客户姓名以大写字母J开头的行。
pandas提供了若干字符串和正则表达式函数,包括startswich,endswith,match和serch等,可以使用这些函数在文本识别字符串和模式
创建Script3.py文件,写入下列程序:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f,'january_2013',index=None)
df_match = df[df['Customer Name'].str.startswith('J')]
writer = pd.ExcelWriter(output_f)
df_match.to_excel(writer,sheet_name='jan_13_output3',index=False)
writer.save()
print(de_match)
在cmd中输出结果:
选取特定的列
除了直接设置数据框外,即在方括号中列出要保留的列索引值或名称。选取列的方法有两种通用的方法,使用列索引值和列标题。
列索引值
通过数据框和iloc函数索进行引。通过iloc函数索引需要保留所有行,例如iloc[:,[1,4]]表示第2列和第5列,第一列为0。iloc[:,[1:4]]表示第2列到第5列。
创建Script4.py,读取第2列和第5列并写入代码:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f,'january_2013',index=None)
df_col_index = df.iloc[:,[1,4]]
writer = pd.ExcelWriter(output_f)
df_col_index.to_excel(writer,sheet_name='jan_13_output4',index=False)
writer.save()
print(df_col_index)
同样,在cmd中输出,结果如下:
列标题
当我们研究的excel文件中,列标题十分容易识别,且标题不变的时候,采用列标题索引使得分析更加简便。
pandas选定列时,一种方式是在数据框名称后的方括号中将列明以字符串的形式列出。另一种是使用loc函数。
创建Script5.py,并且编写代码:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f,'january_2013',index=None)
df_name_index = df.loc[:,['Customer','Purchase Date']]
writer = pd.ExcelWriter(output_f)
df_name_index.to_excel(writer,sheet_name='jan_13_output5',index=False)
writer.save()
print(df_name_index)
cmd中输入,并得到结果:
读取工作簿中所有工作表
我们提供两个范例,演示在所有工作表中筛选特定的行和列。
在panda中,通过在read_excel函数中设置sheetname=None,可以一次性读取工作簿中的所有工作表。接下来,我们尝试一下筛选销售额大于2000.00的所有行。
创建Script5.py,并且编写代码:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f, sheet_name=None, index_col=None)
row_output = []
for worksheet_name,data in df.items():
row_output.append(data[data['Sale Amount'].astype(float)>2000.00])
filtered_rows = pd.concat(row_output,axis=0,ignore_index = True)
writer = pd.ExcelWriter(output_f)
filtered_rows.to_excel(writer,sheet_name='sale_amount_2000',index=False)
writer.save()
print(filtered_rows)
cmd中,输出结果为:
第二个例子:
在所有工作表中选取Customer Name 和 Sale Amount 列。
创建Script6.py,并且编写代码:
#!/usr/bin/env python3
import pandas as pd
import sys
input_f = sys.argv[1]
output_f = sys.argv[2]
df = pd.read_excel(input_f, sheet_name=None, index_col=None)
col_output = []
for worksheet_name,data in df.items(): # 表示df中的键和值
col_output.append(data.loc[:,['Customer Name','Sale Amount']])
selected_cols = pd.concat(col_output,axis=0,ignore_index = True)
writer = pd.ExcelWriter(output_f)
selected_cols.to_excel(writer,sheet_name='seleced_col_all_worksheets',index=False)
writer.save()
print(selected_cols)
cmd中,输出结果为:
注:文章参考《python数据分析基础》