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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容