#Python Pandas 使用一波带走
##简介
Pandas非常易用,但当前很多材料,讲解的过于复杂,容易让用户望而却步。最近几天因流感原因被封闭在家,因此有想起做个简单的样例,能把几个常用功能串一下,便于一些初级用户理解
下载安装
#需要提前安装好pandas
`pip install pandas`
背景:
我们希望分析用户和产品的金额,但是当前excel有2个sheet, 只有先把这2份数据进行关联,然后按用户+Item汇总金额。
步骤:
1. 数据准备
2. 读取excel数据
3. 合并数据,把2份数据合并到1张数据表
4. 数据处理,计算出汇总接,然后存放在新的列中
5. 数据透视,根据客户和商品汇总金额信息
6. 输出结果,把结果保存到EXCEL中
注意Python版本:
- 从 2019年1月1日 开始,所有版本都只支持Python 3,Python核心团队计划在2020年1月1日停止支持Python 2.7
1.数据准备
当前文件夹下SalesData,xlsx有2个SHEET:一份是商品销售数量order_quantity:,一份是商品单价Item_Price
-
order_quantity
Order_NO Customer Item Quantity S001 Jim biscuit 1 S002 Lala beer 4 S002 Lala biscuit 6 S003 Jim chocolate 1 S003 Jim beer 3 -
Item_Price
Item Price biscuit 20 beer 6 chocolate 10
2.读取EXCEL
加载EXCEL文件. pd.read_excel(io, sheetname=0…),其中io是读取的EXCEL名,sheetname是SHEET名。
输入[1]:
import pandas as pd
import numpy as np
df_order_quantity = pd.read_excel("SalesData.xlsx",sheet_name='order_quantity')
df_Item_Price = pd.read_excel("SalesData.xlsx",sheet_name='Item_Price')
注意: 新手读取EXCEL时经常有报错找不到excel,请检查当前文件夹下是否有此Excel及名称是否书写正确。 可以通过os.getcwd()获取当前路径,详情可以参与os模块说明文档
输入[2]:
print(df_order_quantity)
print(df_Item_Price)
输出[2]:
Order_NO Customer Item Quantity
0 S001 Jim biscuit 1
1 S002 Lala beer 4
2 S002 Lala biscuit 6
3 S003 Jim chocolate 1
4 S003 Jim beer 3
Item Price
0 biscuit 20
1 beer 6
2 chocolate 10
读出的文件和EXCEL中的是一致的。
左边多了一列数字(0,1,2…)是因为在默认情况下,系统会给DataFrame新增index
扩展阅读:除了EXCEL之外,Pandas也可以读取csv,json,html,sas等各种类型的数据。
3.合并数据
类似EXCEL中vlookup函数,在pandas里有merge方法可以把2个表关联到一起,实际比vlookup更强大。
和SQL中JOIN一样,有参数how默认内连接,即取交集。实际包含多个可选值:’left’, ‘right’, ‘outer’, ‘inner’分别代表左连接、右连接、外连接、内连接。
输入[3]:
df= pd.merge(df_order_quantity,df_Item_Price,left_on='Item',right_on='Item')
print(df)
输出[3]:
Order_NO Customer Item Quantity Price
0 S001 Jim biscuit 1 20
1 S002 Lala biscuit 6 20
2 S002 Lala beer 4 6
3 S003 Jim beer 3 6
4 S003 Jim chocolate 1 10
扩展阅读:在Pandas中,除了merge函数之外,还有concat函数可以对数据表按行或列进行拼接。
4.数据处理
希望得到 数量(Quantity)*单价(Price)= 总金额(Cumsum_Price),可以使用pandas的列作为向量直接相乘
输入[5]:
df['Cumsum_Price'] = df['Quantity'] * df['Price']
print(df)
输出[5]:
Order_NO Customer Item Quantity Price Cumsum_Price
0 S001 Jim biscuit 1 20 20
1 S002 Lala biscuit 6 20 120
2 S002 Lala beer 4 6 24
3 S003 Jim beer 3 6 18
4 S003 Jim chocolate 1 10 10
可以看到列Cumsum_Price储存了乘积的信息
扩展阅读:在Pandas中,这种列之间计算使用了向量算法,底层使用高度优化过代码,因此速度远快于for循环对单元格进行计算
5.数据透视
我们希望获取人员与Item的汇总金额,有没有类似Excel中数据透视表的方法,答案是肯定有。
输入[6]:
pivot_df =pd.pivot_table(df, values='Cumsum_Price', index=['Customer'], columns=['Item'],aggfunc='sum')
print(pivot_df)
输出[6]:
Item beer biscuit chocolate
Customer
Jim 18.0 20.0 10.0
Lala 24.0 120.0 NaN
我们可以看到每个人对产品的购买倾向,当然此例比较简单。
注意有个值是NaN,表示缺失值
扩展阅读: 实际本例也可以不使用数据透视表,而通过分类汇总来实现,也是很常用方法,条条大道通罗马。
6.输出结果
已经有结果了,可以把结果存在EXCEL中
输入[7]:
pivot_df.to_excel("output_pivot.xlsx")
然后会在当前文件夹下,看到一个新的Excel叫output_pivot.xlsx,打开就能看到
Customer | beer | biscuit | chocolate |
---|---|---|---|
Jim | 18 | 20 | 10 |
Lala | 24 | 120 |
扩展阅读:数据也可以保存在csv,json,html,sas等各种类型的数据。
##结束
此页为空白
Created By:hanpengzhou
Created date: 2020-02-09
##附件1:本样例完整代码:
# %%
import pandas as pd
import numpy as np
df_order_quantity = pd.read_excel("SalesData.xlsx",sheet_name='order_quantity')
df_Item_Price = pd.read_excel("SalesData.xlsx",sheet_name='Item_Price')
# %%
print(df_order_quantity)
print(df_Item_Price)
# %%
df= pd.merge(df_order_quantity,df_Item_Price,left_on='Item',right_on='Item')
print(df)
# %%
df['Cumsum_Price'] = df['Quantity'] * df['Price']
print(df)
# %%
pivot_df =pd.pivot_table(df, values='Cumsum_Price', index=['Customer'], columns=['Item'],aggfunc='sum')
print(pivot_df)
# %%
pivot_df.to_excel("output_pivot.xlsx")