Pandas数据运算

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容