本专栏将详细介绍 Python 常用库 Pandas 的用法
目录
1.1 读取数据
变量名用df(DataFrame的缩写,后续会介绍),它是Pandas二维数据的基础结构
import pandas as pd # 引入Pandas库,按惯例起别名pd
# 以下两种效果一样,如果是网址,它会自动将数据下载到内存
df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
df = pd.read_excel('team.xlsx') # 文件在notebook文件同一目录下
# 如果是CSV,使用pd.read_csv(),还支持很多类型的数据读取
其中:自动增加了第一列,是Pandas为数据增加的索引,从0开始,程序不知道我们真正的业务索引,往往需要后面重新指定,使它有一定的业务意义;由于数据量大,自动隐藏了中间部分,只显示前后5条;底部显示了行数和列数。
1.2 查看数据
df.head() # 查看前5条,括号里可以写明你想看的条数
df.tail() # 查看尾部5条
df.sample(5) # 随机查看5条
1.3 验证数据
df.shape # (100, 6) 查看行数和列数
df.info() # 查看索引、数据类型和内存信息
df.describe() # 查看数值型列的汇总统计
df.dtypes # 查看各字段类型
df.axes # 显示数据行和列名
df.columns # 列名
df.info()显示有数据类型、索引情况、行列数、各字段数据类型、内存占用等:
df.describe()会计算出各数字字段的总数(count)、平均数(mean)、标准差(std)、最小值(min)、四分位数和最大值(max)
1.4 建立索引
以上数据真正业务意义上的索引是name列,所以我们需要使它成为索引:
df.set_index('name', inplace=True) # 建立索引并生效
其中可选参数inplace=True会将指定好索引的数据再赋值给df使索引生效,否则索引不会生效。注意,这里并没有修改原Excel,从我们读取数据后就已经和它没有关系了,我们处理的是内存中的df变量。
1.5 数据选取
接下来,我们像Excel那样,对数据做一些筛选操作。
(1)选择列:
# 查看指定列
df['Q1']
df.Q1 # 同上,如果列名符合Python变量名要求,可使用
这里返回的是一个Series类型数据,可以理解为数列,它也是带索引的。之前建立的索引在这里发挥出了作用,否则我们的索引是一个数字,无法知道与之对应的是谁的数据。
选择多列的可以用以下方法:
# 选择多列
df[['team', 'Q1']] # 只看这两列,注意括号
df.loc[:, ['team', 'Q1']] # 和上一行效果一样
df.loc[x, y]是一个非常强大的数据选择函数,其中x代表行,y代表列,行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引,需要用df.iloc[])。下面的例子中会进行演示。
(2)选择行:
# 用指定索引选取
df[df.index == 'Liver'] # 指定姓名
# 用自然索引选择,类似列表的切片
df[0:3] # 取前三行
df[0:10:2] # 在前10个中每两个取一个
df.iloc[:10,:] # 前10个
(3)指定行和列
同时给定行和列的显示范围:
df.loc['Ben', 'Q1':'Q4'] # 只看Ben的四个季度成绩
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间
(4)条件选择
按一定的条件显示数据:
# 单一条件
df[df.Q1 > 90] # Q1列大于90的
df[df.team == 'C'] # team列为'C'的
df[df.index == 'Oscar'] # 指定索引即原数据中的name
# 组合条件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and关系
df[df['team'] == 'C'].loc[df.Q1>90] # 多重筛选
1.6 排序
df.sort_values(by='Q1') # 按Q1列数据升序排列
df.sort_values(by='Q1', ascending=False) # 降序
df.sort_values(['team', 'Q1'], ascending=[True, False]) # team升序,Q1降序
1.7 分组聚合
可以实现类似SQL的groupby那样的数据透视功能:
df.groupby('team').sum() # 按团队分组对应列相加
df.groupby('team').mean() # 按团队分组对应列求平均
# 不同列不同的计算方法
df.groupby('team').agg({'Q1': sum, # 总和
'Q2': 'count', # 总数
'Q3':'mean', # 平均
'Q4': max}) # 最大值
1.8 数据转换
对数据表进行转置,不过我们这里仅用sum聚合。
df.groupby('team').sum().T
也可以试试以下代码,看有什么效果:
df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()
1.9 增加列
用Pandas增加一列非常方便,就与新定义一个字典的键值一样。
df['one'] = 1 # 增加一个固定值的列
df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加总成绩列
# 将计算得来的结果赋值给新列
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1)
df['total'] = df.sum(axis=1) # 可以把所有为数字的列相加
df['avg'] = df.total/4 # 增加平均成绩列
1.10 统计分析
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 方差
s.mode() # 众数
1.11 绘图
Pandas利用plot()调用Matplotlib快速绘制出数据可视化图形。注意,第一次使用plot()时可能需要执行两次才能显示图形。如图1-13所示,可以使用plot()快速绘制折线图。
df['Q1'].plot() # Q1成绩的折线分布
可以先选择要展示的数据,再绘图。
df.loc['Ben','Q1':'Q4'].plot() # ben四个季度的成绩变化
可以使用plot.bar绘制柱状图。
df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 横向柱状图
对数据聚合计算后,可以绘制成多条折线图:
# 各Team四个季度总成绩趋势
df.groupby('team').sum().T.plot()
也可以用pie绘制饼图:
# 各组人数对比
df.groupby('team').count().Q1.plot.pie()
1.12 导出
df.to_excel('team-done.xlsx') # 导出 Excel文件
df.to_csv('team-done.csv') # 导出 CSV文件
导出的文件位于notebook文件的同一目录下。
————————————————————————————
查看主页阅读更多内容。