[python][科学计算][pandas]简要使用教程3-数组与统计运算

最后一次更新日期: 2019/3/21

pandas是基于numpy的数据分析库,提供一些更易用的数据模型和大量高效的统计方法。

使用前先导入模块:
import pandas as pd
按需导入以下模块:
import numpy as np
import matplotlib.pyplot as plt

1. 运算符和标量值函数

pandas重载了python的大部分运算符,可以直接进行数组计算,numpy的标量值函数也可直接使用,这些运算都是将原本作用于单个元素的运算拓展到整个数组。

In [56]: df=pd.DataFrame([[1,'2'],[3,'a']],columns=['col1','col2'])

In [57]: df+df
Out[57]: 
   col1 col2
0     2   22
1     6   aa

In [201]: np.sqrt(df.col1)
Out[201]: 
0    1.000000
1    1.732051
Name: col1, dtype: float64

使用的运算符和函数必须对参与运算的所有数据类型都是有意义的,否则会报错。

匹配方式
In [154]: s1=pd.Series([1,2,3,4],index=[0,1,2,3])

In [155]: s2=pd.Series([5,6,7,8],index=[1,2,3,4])

In [156]: s1+s2
Out[156]: 
0     NaN
1     7.0
2     9.0
3    11.0
4     NaN
dtype: float64

此处需要注意pandas和numpy的区别,pandas的数组运算在元素匹配上是基于标签索引的,未能匹配到的位置会被替换为NaN,numpy则是基于位置索引。

2. 统计方法

聚合函数

pandas继承了numpy的聚合函数:summeanmaxmin等。
可通过SeriesDataFrame的方法调用,或是调用numpy下的静态方法。

In [58]: df.sum()
Out[58]: 
col1     4
col2    2a
dtype: object

In [60]: np.max(df)
Out[60]: 
col1    3
col2    a
dtype: object

In [114]: df.agg({'col1':'max','col2':'sum'})
Out[114]: 
col1     3
col2    2a
dtype: object

In [115]: df.agg(['max','sum'])
Out[115]: 
     col1 col2
max     3    a
sum     4   2a

通过pandas数据模型的方法调用时,
第一个参数axis可以指定统计的轴,Series指定该参数没有意义,DataFrame默认沿轴0统计,即按列统计。pandas无法指定对所有轴展开统计,如有需要可以使用numpy的方法;
第二个参数skipna可以指示是否跳过NaN值;
第三个参数level用于在存在多级索引的情况下指定某一级索引进行统计;
第四个参数numeric_only用于指定是否只对数字应用计算。

当对DataFrame沿行方向统计时,由于不同列的数据类型可能不一样,需保证对应运算是有意义的,否则无法得到期望的结果。

agg方法是aggregate方法的简写,用于对不同列应用不同聚合函数或是多种聚合函数,可以传入list或是dict声明统计方式。

分组统计

pandas提供了类似于sql的groupby方法用于分组统计。

In [88]: df=pd.DataFrame([['a','c',1],['a','d',2],['b','d',3]],columns=['col1','col2','col3'])

In [89]: df
Out[89]: 
  col1 col2  col3
0    a    c     1
1    a    d     2
2    b    d     3

In [93]: result=df.groupby(by=['col1','col2']).agg(['max','min'])

In [94]: result
Out[94]: 
          col3    
           max min
col1 col2         
a    c       1   1
     d       2   2
b    d       3   3

In [95]: result.sum(level=0)
Out[95]: 
     col3    
      max min
col1         
a       3   3
b       3   3

In [140]: gb=df.groupby(by=['col1','col2'])

In [141]: gb.groups
Out[141]: 
{('a', 'c'): Int64Index([0], dtype='int64'),
 ('a', 'd'): Int64Index([1], dtype='int64'),
 ('b', 'd'): Int64Index([2], dtype='int64')}

In [142]: gb.get_group(('a','c'))
Out[142]: 
  col1 col2  col3
0    a    c     1

只调用groupby方法会得到一个DataFrameGroupBy对象,通过其groups方法可查看所有分组信息,get_group方法可获取指定分组。
该对象可调用各种聚合函数,或调用agg方法进行复合的聚合统计,返回包含多级索引的DataFrame统计结果表,对于结果表,可以继续应用统计函数并通过level参数指定索引级别进行二次统计。

3. 应用自定义函数

除pandas和numpy提供的函数外,还可以自定义函数并使用applyapplymapmap方法快速应用于整个数据集。

In [119]: df.apply(lambda x: x.col1+x.col2, axis=1)
Out[119]: 
0    3
1    7
dtype: int64

In [120]: def add(row):
     ...:     return row.col1+row.col2

In [121]: df.apply(add, axis=1)
Out[121]: 
0    3
1    7
dtype: int64

In [122]: df.applymap(lambda x: x*2)
Out[122]: 
   col1  col2
0     2     4
1     6     8

In [123]: def double(item):
     ...:     return item*2

In [124]: df.applymap(double)
Out[124]: 
   col1  col2
0     2     4
1     6     8

In [128]: s=pd.Series(['a','b','b'])

In [129]: s.map(lambda x: x*2)
Out[129]: 
0    aa
1    bb
2    bb
dtype: object

In [130]: s.map({'a':'c','b':'d'})
Out[130]: 
0    c
1    d
2    d
dtype: object

DataFrameapplyapplymap两个方法:
apply将函数应用于每行或者每列,axis参数指定应用函数的轴方向,值为0表示按列应用,即逐列作为函数的参数进行计算,值为1表示按行应用,默认为0;
applymap将函数应用于每个元素。

Series只有一个map方法,用于将函数应用于元素,除此以外,还提供值映射的功能,输入dict类型时会根据key-value映射将相应的值替换。

支持lambda匿名函数。

4. 广播

In [80]: l2=[1,2]
    ...: a2=np.array(l2)
    ...: s2=pd.Series(l2)
    ...: df21=pd.DataFrame([1,2])
    ...: df12=pd.DataFrame([[1,2]])
    ...: l22=[[1,2],[3,4]]
    ...: a22=np.array(l22)
    ...: df22=pd.DataFrame(l22)
    ...: df23=pd.DataFrame([[3,4,5],[6,7,8]])

In [99]: df22+l2
Out[99]: 
   0  1
0  2  4
1  4  6

In [100]: df22+a2
Out[100]: 
   0  1
0  2  4
1  4  6

In [101]: df22+s2
Out[101]: 
   0  1
0  2  4
1  4  6

In [102]: df22+df21
Out[102]: 
   0   1
0  2 NaN
1  5 NaN

In [103]: df22+df12
Out[103]: 
     0    1
0  2.0  4.0
1  NaN  NaN

In [104]: df23+s2
Out[104]: 
     0    1   2
0  4.0  6.0 NaN
1  7.0  9.0 NaN

In [130]: df21+df12
Out[130]: 
     0   1
0  2.0 NaN
1  NaN NaN

pandas的广播机制继承自numpy但有不一样的地方:
标量值会与DataFrameSeries中每个元素进行同样的计算;
Series或一维list或一维ndarray会与DataFrame的每一行进行运算,Series在长度不足以匹配DataFrame的行时不足部分会替换为NaN,其他两种长度不足会报错;
DataFrameDataFrame进行运算会按元素匹配,无论行列,长度不足的部分都会替换为NaN
二维ndarrayDataFrame的运算遵循numpy的广播规则,长度不足且为1的轴会被广播至同等大小;
二维listDataFrame的运算不被支持。

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

推荐阅读更多精彩内容