Python易筋经-pandas

“宠辱若惊,贵大患若身。
何谓宠辱若惊?
宠为下。
得之若惊,失之若惊,是谓宠辱若惊。
何谓贵大患若身?
吾所以有大患者,为吾有身。
及吾无身,吾有何患?
故贵以身为天下,若可以寄于天下,爱以身为天下者,若可托天下。”[1]

pandas

pandas是基于numpy构建的,让以 Numpy 为中心的应用变得更加简单。
pandas主要有Series(对映一维数组),DataFrame(对映二维数组),Panel(对映三维数组),Panel4D(对映四维数组),PanelND(多维)等数据结构。

  • Series
    一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
  • DataFrame
    二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
  • Panel
    三维的数组,可以理解为DataFrame的容器。

导入包:

import numpy as np
import pandas as pd

Series

由一组数据(各种Numpy数据类型),以及一组与之相关的标签数据(即索引)组成。仅由一组数据即可产生最简单的Series,可以通过传递一个list对象来创建一个Series。

arr = pd.Series([1,3,4,5,6,7,0,4])
arr

输出:

0    1
1    3
2    4
3    5
4    6
5    7
6    0
7    4
dtype: int64

获取 Series 的索引:

arr.index

输出:

RangeIndex(start=0, stop=8, step=1)

DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每一列的数据结构都是相同的,而不同的列之间则可以是不同的数据结构(数值、字符、布尔值等)。或者以数据库进行类比,DataFrame中的每一行是一个记录,名称为Index的一个元素,而每一列则为一个字段,是这个记录的一个属性。DataFrame既有行索引也有列索引,可以被看做由Series组成的字典(共用同一个索引)。
创建一个DataFrame,包括一个numpy array, 时间索引和列名字:

dates = pd.date_range('20180101',periods=6)
dates

输出:

DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05', '2018-01-06'],
              dtype='datetime64[ns]', freq='D')

创建DataFrame,如:

df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df

np.random.randn(6,4) 从标准正态分布中创建6行4列的二维矩阵

输出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
2018-01-03  -1.065446   0.686846    -0.241674   0.296789
2018-01-04  0.338885    0.459906    0.852208    1.007623
2018-01-05  -0.227588   0.872227    2.077327    0.886460
2018-01-06  -0.838204   0.087443    0.537748    1.372528

通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:

df1 = pd.DataFrame({'A':3.,
                  'B':pd.date_range('20180101',periods=6),
                  'C':np.array([2]*6,dtype='int32'),
                  'D':pd.Series(2,index=list(range(6)),dtype='float32')
                   })
df1

输出:


    A   B           C   D
0   3.0 2018-01-01  2   2.0
1   3.0 2018-01-02  2   2.0
2   3.0 2018-01-03  2   2.0
3   3.0 2018-01-04  2   2.0
4   3.0 2018-01-05  2   2.0
5   3.0 2018-01-06  2   2.0

查看不同列的数据类型:

df1.dtypes

输出:

A           float64
B    datetime64[ns]
C             int32
D           float32
dtype: object

DataFrame查看数据

以df为数据蓝本,查看前2条记录:

df.head(2)

输出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176

查看后2条记录:

df.tail(2)

输出:

            A           B           C           D
2018-01-05  -0.227588   0.872227    2.077327    0.886460
2018-01-06  -0.838204   0.087443    0.537748    1.372528

显示索引、列和底层的numpy数据:

df.index

输出:

DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05', '2018-01-06'],
              dtype='datetime64[ns]', freq='D')

查看 DataFrame 的列名

df.columns

输出:

Index(['A', 'B', 'C', 'D'], dtype='object')

查看 DataFrame 的值:

df.values

输出:

array([[-0.53898743, -1.17382617,  1.60778544, -1.16839686],
       [-0.98767434, -0.96164339, -0.63683738, -0.60717624],
       [-1.06544554,  0.68684576, -0.24167378,  0.29678857],
       [ 0.33888503,  0.45990635,  0.85220803,  1.0076235 ],
       [-0.22758765,  0.87222716,  2.07732729,  0.88645989],
       [-0.83820381,  0.08744284,  0.53774757,  1.37252846]])

describe()函数对于数据的快速统计汇总:

df.describe()

输出:

       A        B           C            D
count   6.000000    6.000000    6.000000    6.000000
mean    -0.553169   -0.004841   0.699426    0.297971
std 0.535618    0.866508    1.043502    0.997409
min -1.065446   -1.173826   -0.636837   -1.168397
25% -0.950307   -0.699372   -0.046818   -0.381185
50% -0.688596   0.273675    0.694978    0.591624
75% -0.305438   0.630111    1.418891    0.977333
max 0.338885    0.872227    2.077327    1.372528

对结果简单解释一下:

count:数量
mean:平均值
std:标准偏差
min:最小值
max:最大值

其中25% 50% 75% 四分位数;即把数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。
第1四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
第2四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
第3四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
第3四分位数与第1四分位数的差距又称四分位距(InterQuartile Range,IQR)

转置:df.transpose() or .T

df.transpose() or df.T

输出:

    2018-01-01 00:00:00 2018-01-02 00:00:00 2018-01-03 00:00:00 2018-01-04 00:00:00 2018-01-05 00:00:00 2018-01-06 00:00:00
A   -0.538987   -0.987674   -1.065446   0.338885    -0.227588   -0.838204
B   -1.173826   -0.961643   0.686846    0.459906    0.872227    0.087443
C   1.607785    -0.636837   -0.241674   0.852208    2.077327    0.537748
D   -1.168397   -0.607176   0.296789    1.007623    0.886460    1.372528

按值进行排序

df.sort_values(by='A',ascending=False)

输出:

            A           B           C           D
2018-01-04  0.338885    0.459906    0.852208    1.007623
2018-01-05  -0.227588   0.872227    2.077327    0.886460
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-06  -0.838204   0.087443    0.537748    1.372528
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
2018-01-03  -1.065446   0.686846    -0.241674   0.296789

获取数据

  • 按列获取数据
df['A']

输出:

2018-01-01   -0.538987
2018-01-02   -0.987674
2018-01-03   -1.065446
2018-01-04    0.338885
2018-01-05   -0.227588
2018-01-06   -0.838204
Freq: D, Name: A, dtype: float64

按列取多列

df[['A','B']]

输出:

            A           B
2018-01-01  -0.538987   -1.173826
2018-01-02  -0.987674   -0.961643
2018-01-03  -1.065446   0.686846
2018-01-04  0.338885    0.459906
2018-01-05  -0.227588   0.872227
2018-01-06  -0.838204   0.087443
  • 按行获取数据
df[:3]

输出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
2018-01-03  -1.065446   0.686846    -0.241674   0.296789

貌似等效于df.head(3)
.ix(位置or标签起,位置or标签止)来获取数据,它自动根据给到的索引类型判断是使用位置还是标签进行切片。

df.ix['2018-01-01':'2018-01-02']

输出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
df.ix[1,1]

输出:

-0.96164339276293087
df.ix[1,'C']

输出:

-0.63683738086017361

通过逻辑指针进行数据切片:

df[逻辑条件]
df[df.xxx >= 2] #单个逻辑条件
df[(df.xxx >=1 ) & (df.xxx < 3) ] #多个逻辑条件组合

df[df.A>0]

输出:


            A           B           C           D
2018-01-04  0.338885    0.459906    0.852208    1.007623

可以利用逻辑条件进行更改数据

panel (略)

略.....

缺失数据处理

去掉包含缺失值的行

  • df.dropna()
    将有缺失数据行丢弃
  • df.fillna(value=0)
    将缺失项赋值0
  • df.isnull(df)
    判断数据是否为nan,并进行布尔填充

函数的应用和映射

列计算平均值

df.mean()

输出:

A   -0.553169
B   -0.004841
C    0.699426
D    0.297971
dtype: float64

行计算平均值

df.mean(1)

输出:

2018-01-01   -0.318356
2018-01-02   -0.798333
2018-01-03   -0.080871
2018-01-04    0.664656
2018-01-05    0.902107
2018-01-06    0.289879
Freq: D, dtype: float64

罗列出其他常用的方法:

count 非na值的数量

describe 针对Series或个DataFrame列计算汇总统计

min、max 计算最小值和最大值

argmin、argmax 计算能够获取到最大值和最小值得索引位置(整数)

idxmin、idxmax 计算能够获取到最大值和最小值得索引值

quantile 计算样本的分位数(0到1)

sum 值的总和

mean 值得平均数

median 值得算术中位数(50%分位数)

mad 根据平均值计算平均绝对离差

var 样本值的方差

std 样本值的标准差

skew 样本值得偏度(三阶矩)

kurt 样本值得峰度(四阶矩)

cumsum 样本值得累计和

cummin,cummax 样本值得累计最大值和累计最小值

cumprod 样本值得累计积

diff 计算一阶差分(对时间序列很有用)

pct_change 计算百分数变化

数据规整

Pandas提供了大量的方法能够轻松的对Series,DataFrame和Panel对象进行各种符合各种逻辑关系的合并操作

  • concat 可以沿一条轴将多个对象堆叠到一起。
  • append 将一行连接到一个DataFrame上
  • duplicated 移除重复数据

  1. 老子《道德经》第十三章,老子故里,中国鹿邑。

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

推荐阅读更多精彩内容