Pandas数据运算
import numpy as np
import pandas as pd
# 数据
a = pd.Series([9,8,7,6],index=['a','b','c','d'])
a
a 9
b 8
c 7
d 6
dtype: int64
b = pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
b
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | 0 | 1 | 2 | 3 | 4 |
a | 5 | 6 | 7 | 8 | 9 |
d | 10 | 11 | 12 | 13 | 14 |
b | 15 | 16 | 17 | 18 | 19 |
Python科学计算的基本方式是:向量化运算(矢量化运算),并行运算
衡量一个人会不会用Pandas做数据分析
- 会不会分组聚合推导透视表、交叉表
- 会不会用矢量化编程完成项目
自定义运算
Series
map()
DataFrame
apply() *******************
applymap()
- 如果Pandas库自带的运算和函数不满足需求,可以自定义函数,并同时将函数应用到Pandas的每行/列或值上
- 应用函数主要用于替代传统的for循环
- 可以将map或apply的参数x理解为for循环的i值(series就是单值,DataFrame就是每一行(列)值)
针对Series的map函数,会将自定义函数应用到Series对象的每个值
Series的map函数
a
a 9
b 8
c 7
d 6
dtype: int64
# 对Series数据进行一个复杂运算
9 + 1 - 2 * 3 / 4
8.5
# for遍历实现
a2 = []
for i in a:
a2.append(i + 1 - 2 * 3 / 4)
a2
[8.5, 7.5, 6.5, 5.5]
# 简单的运算和操作,可以直接用向量化编程实现
a + 1 - 2 * 3 / 4
a.sum()
30
# 自定义函数,向量化编程(并行运算)
# def aaa(x):
# return x + 1 - 2 * 3 / 4
aaa = lambda x: x + 1 - 2 * 3 / 4 # lambda表达式,乞丐版函数(匿名函数)
a.map(aaa) # Series使用map进行自定义函数运算
a.apply(aaa) # Series也能使用apply
a 8.5
b 7.5
c 6.5
d 5.5
dtype: float64
DataFrame的自定义函数操作
- apply:操作 行、列
- applymap:操作单元格
b
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | 0 | 1 | 2 | 3 | 4 |
a | 5 | 6 | 7 | 8 | 9 |
d | 10 | 11 | 12 | 13 | 14 |
b | 15 | 16 | 17 | 18 | 19 |
# 自定义函数,向量化编程(并行运算)
def bbb(x):
return x + 1 - 2 * 3 / 4
b.apply(bbb) # 应用到行
b.applymap(bbb) # 应用到单元格
# 直接应用于单元格的算法,两个函数效果一样
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | -0.5 | 0.5 | 1.5 | 2.5 | 3.5 |
a | 4.5 | 5.5 | 6.5 | 7.5 | 8.5 |
d | 9.5 | 10.5 | 11.5 | 12.5 | 13.5 |
b | 14.5 | 15.5 | 16.5 | 17.5 | 18.5 |
不直接应用于单元格的算法
关于行和列的思路
- axis=0 按行操作
- 给这一列的所有行,进行运算
- axis=1 按列操作
- 给这一行的所有列,进行运算
DataFrame的apply自定义函数应用,复杂,重要
b
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | 0 | 1 | 2 | 3 | 4 |
a | 5 | 6 | 7 | 8 | 9 |
d | 10 | 11 | 12 | 13 | 14 |
b | 15 | 16 | 17 | 18 | 19 |
def ccc(x):
return x.min() # 返回行、列的最小值
b.apply(ccc) # 默认axis=0,按行运算(每一列的所有行)
# b.applymap(bbb) # 报错,单元格没有最小值
0 0
1 1
2 2
3 3
4 4
dtype: int64
b.apply(ccc, axis=1) # 按列运算(每一行的所有列)
c 0
a 5
d 10
b 15
dtype: int64
def ddd(x):
# return x.min()
# return x.min(), x.max()
# 输出DataFrame *********************************
return pd.Series([x.min(), x.max()], index=['min', 'max']) # 构建Series,会返回DataFrame
b.apply(ddd)
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
min | 0 | 1 | 2 | 3 | 4 |
max | 15 | 16 | 17 | 18 | 19 |
b.apply(ddd, axis=1)
min | max | |
---|---|---|
c | 0 | 4 |
a | 5 | 9 |
d | 10 | 14 |
b | 15 | 19 |
自定义函数的参数x,用apply调用,在运算过程中表示DataFrame的1行或1列(是Series对象,可以理解为for循环遍历,但它是并行运算)
基本统计函数
Pandas的统计运算方法,和Numpy基本一致
默认针对0轴(行)做运算,大部分函数可加参数 axis=1 改为对列运算
函数 | 解释 |
---|---|
.describe() | 针对0轴的统计汇总,计数/平均值/标准差/最小值/四分位数/最大值 |
.sum() | 计算数据的总和,按0轴计算(各行计算),下同,要按列计算参数1 |
.count() | 非NaN值数量 |
.mean() .median() .mode() | 计算数据的算数平均值/中位数/众数 |
.var() .std() | 计算数据的方差/标准差 |
.min() .max() | 计算数据的最小值/最大值 |
.idxmin() .idxmax() | 计算数据第一个最大值/最小值所在位置的索引,给索引或切片使用(自定义索引,排除null/NA等空值) |
b
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | 0 | 1 | 2 | 3 | 4 |
a | 5 | 6 | 7 | 8 | 9 |
d | 10 | 11 | 12 | 13 | 14 |
b | 15 | 16 | 17 | 18 | 19 |
求和
b.sum()
b.sum(axis=0) # 按行求和(每一列的所有行)
0 30
1 34
2 38
3 42
4 46
dtype: int64
0 + 5 + 10 + 15
30
b.sum(axis=1) # 按列求和(每一行的所有列)
c 10
a 35
d 60
b 85
dtype: int64
0 + 1 + 2 + 3 + 4
10
计数
b.count()
b.count(axis=1)
c 5
a 5
d 5
b 5
dtype: int64
最小值,最大值
b.min()
b.min(axis=1)
c 0
a 5
d 10
b 15
dtype: int32
求最小值最大值所在的索引(如果有多个相同的最小、最大值,取第一个值的索引)
a
a 9
b 8
c 7
d 6
dtype: int64
a.idxmin(), a.idxmax()
('d', 'a')
b
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | 0 | 1 | 2 | 3 | 4 |
a | 5 | 6 | 7 | 8 | 9 |
d | 10 | 11 | 12 | 13 | 14 |
b | 15 | 16 | 17 | 18 | 19 |
b.idxmin()
0 c
1 c
2 c
3 c
4 c
dtype: object
b.idxmin(axis=1)
c 0
a 0
d 0
b 0
dtype: int64
快速综合统计指标
a
a 9
b 8
c 7
d 6
dtype: int64
a.describe()
count 4.000000
mean 7.500000
std 1.290994
min 6.000000
25% 6.750000
50% 7.500000
75% 8.250000
max 9.000000
dtype: float64
type(a.describe())
pandas.core.series.Series
a.describe()['max']
9.0
b
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
c | 0 | 1 | 2 | 3 | 4 |
a | 5 | 6 | 7 | 8 | 9 |
d | 10 | 11 | 12 | 13 | 14 |
b | 15 | 16 | 17 | 18 | 19 |
b.describe()
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
count | 4.000000 | 4.000000 | 4.000000 | 4.000000 | 4.000000 |
mean | 7.500000 | 8.500000 | 9.500000 | 10.500000 | 11.500000 |
std | 6.454972 | 6.454972 | 6.454972 | 6.454972 | 6.454972 |
min | 0.000000 | 1.000000 | 2.000000 | 3.000000 | 4.000000 |
25% | 3.750000 | 4.750000 | 5.750000 | 6.750000 | 7.750000 |
50% | 7.500000 | 8.500000 | 9.500000 | 10.500000 | 11.500000 |
75% | 11.250000 | 12.250000 | 13.250000 | 14.250000 | 15.250000 |
max | 15.000000 | 16.000000 | 17.000000 | 18.000000 | 19.000000 |
type(b.describe())
pandas.core.frame.DataFrame
# 查询
b.describe().loc[['min', 'max'], [0, 2, 4]]
0 | 2 | 4 | |
---|---|---|---|
min | 0.0 | 2.0 | 4.0 |
max | 15.0 | 17.0 | 19.0 |