Pandas
Pandas(/ˈpændəz/)是一个开源的、BSD 许可的库,为 Python 编程语言提供高性能、易于使用的数据结构和数据分析工具。
Pandas 适合处理一个规正的二维数据,即有 N 行 N 列,类似于 SQL 执行后产出的,或者 无合并单元格 Excel 表格。
一、快速入门
1、读取数据
import pandas as pd
df = pd.read_excel('https://www.gairuo.com/file/data/team.xlsx')
df = pd.read_excel('team.xlsx') # 文件在启动目录下
# 如果是 csv 的话使用 pd.read_csv()
df.shape # (100, 6) 查看行数和列数
df.info() # 显示有数据类型、索引情况、行列数、各字段数据类型、内存占用等
df.describe() # 计算出各数字字段的总数、平均数、标准差、最大最小值和四分位数
df.dtypes # 查看各字段类型
df.axes # 显示数据行和列名
df.columns # 列名
注:df. 即输入变量名并输入 . 后按 tab 键会提示此对象的所有方法和属性,这是 IPython 的功能,这是一个通用的功能,所有的对象和变量都支持。
2、建立索引
业务索引 name 列:
df.set_index('name', inplace=True) # 建立索引并生效
其中可选参数 inplace=True 会将指定好索引的数据再赋值给 df 使索引生效。
3、数据选取
df.head(n) # 查看 DataFrame 对象的前 n 行
df.tail(n) # 后 n 行
df.sample(n) # 随机查看 n 个样本
df.index # 查看索引内容
1)选择列
返回 Series 类型数据。
# 查看指定列
df['Q1']
df.Q1 # 这里返回的是一个 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个
# 指定行列
df.loc['Ben', 'Q1':'Q4'] # 只看 Ben 的四个季度成绩
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间
3)条件选择
# 单一条件
df[df.Q1 > 90]
df[df.team == 'C']
df[df.index == 'Oscar']
# 组合条件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and
df[df['team'] == 'C'].loc[df.Q1>90]
4、排序
df.sort_values(by='Q1') # 返回 按 Q1 列数据升序排列
df.sort_values(by='Q1', ascending=False) # 降序
df.sort_values(['team', 'Q1'], ascending=[True, False])
5、分组聚合
df.groupby('team').sum() # 按团队分组对应列相加
df.groupby('team').mean() # 按团队分组对应列求平均
# 不同列不同的计算方法
df.groupby('team').agg({'Q1': sum,
'Q2': 'count',
'Q3':'mean', # 平均
'Q4': max})
6、数据转换
可以对数据表进行转置,以 A-Q1 和 E-Q4 为两点组成的折线为轴对数据进行旋转:
df.groupby('team').sum().T
df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()
7、增加列
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 # 增加平均成绩列
8、简单分析
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 方差
s.mode() # 众数
9、画图
Pandas 利用 plot() 调用 matplotlib 快速绘制出数据可视化图形。注意,第一次使用 plot() 时可能需要执行两下才能显示图形。
df['Q1'].plot() # Q1 成绩的折线分布
df.loc['Ben','Q1':'Q4'].plot() # ben 四个季度的成绩变化
df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 横向柱状图
df.groupby('team').sum().T.plot() # 各 Team 四个季度总成绩趋势
df.groupby('team').count().Q1.plot.pie() # 各组人数对比
10、输出
df.to_excel('team-done.xlsx') # 导出 excel
df.to_csv('team-done.csv') # 导出 csv
二、Pandas 数据结构
维数 | 名称 | 描述 |
1 | Series | 带标签的一维同构数组 |
2 | DataFrame | 带标签的,大小可变的,二维异构表格 |
注:三维的面板(Panel)结构已经不再支持。
Series (系列、数列、序列)是一个带有标签的一维数组。
以下各国的 GDP 就是一个典型的 Series,国家是标签、索引,起到解释数据的作用。
import pandas as pd
pd.Series([14.22,21.34,5.18],index=['中国','美国','日本'])
中国 14.22
美国 21.34
日本 5.18
dtype: float64
带有同样标签和索引的 Series 可以组成一个 DataFrame,比如我们再增加一个国家的人口。
DataFrame 是 Pandas 定义的一个二维数据结构,DataFrame 是 Series 的容器。
- 横向的称作行(row),一条数据
- 纵向的称作列(column),一个字段,是一条数据的某个值
- 第一行是表头,或者可叫字段名
- 第一列是索引(index),就是这行数据所描述的主体,也是这条数据的关键
- 表头和索引在一些场景下也有称列索引和行索引的
- 行索引和列索引可能会出外多层索引的情况
Numpy 是一个高效的科学计算库,Panas 的这些数据结构是构建在 Numpy 数组之上,所以处理速度非常快。
Series 和 DataFrame 里边的值都是可变的,它们都可以增加行,并排序,Series 只有一列不能再增加,DataFrame 可以增加列。
我们在处理数据时,不要对原始数据及转入进来的初始数据(如 DataFrame 一般变量为 df)进行改动,而是复制生成新的对象,或者使用方法链。