Series和DataFrame的数据取值与选择

Series和DataFrame的数据取值与选择

数据取值与选择

NumPy数据取值的方法,包括取值操作(如arr[2, 1])、切片操作(如arr[:, 1:5])、掩码操作(如arr[arr > 0])、花哨的索引操作(如arr[0, [1, 5]]),以及组合操作(如arr[:, [1, 5]])。

在NumPy的二维数组里,data[0]返回第一行,而在DataFrame中,data['col0']返回第一列。

import numpy as np
import pandas as pd

Series数据选择方法

将Series看作字典,

Series对象提供了键值对的映射。

data = pd.Series(np.linspace(0.25, 1, 4), index=['a', 'b', 'c', 'd'])
data

a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64

data['b']

0.5

# 用Python字典的表达式和方法来检测键/索引和值:
'a' in data

True

data.keys()

Index(['a', 'b', 'c', 'd'], dtype='object')

data.items()

<zip at 0x84775c8>

list(data.items())

[('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]

# 增加新的索引值扩展Series
data['e'] = 1.25

将Series看作一维数组,

具备和Numpy数组一样的数组数据选择功能,包括索引、掩码、花哨的索引操作。

# 将显式索引作为切片
data['a':'c']

a    0.25
b    0.50
c    0.75
dtype: float64

# 将隐式整数索引作为切片
data[0:2]

a    0.25
b    0.50
dtype: float64

# 掩码
data[(data > 0.3) & (data < 0.8)]

b    0.50
c    0.75
dtype: float64

# 花哨的索引
data[['a', 'e']]

a    0.25
e    1.25
dtype: float64

当使用显式索引(即
data['a':'c'])作切片时,结果包含最后一个索引;而当使用隐式索引(即 data[0:2])
作切片时,结果不包含最后一个索引。

索引器:loc、iloc和ix,

如果Series是显式整数索引,那么data[1]这样的取值操作会使用显式索引,而data[1:3]这样的切片操作会使用隐式索引。

data = pd.Series(['a', 'b', 'c'], index=(1, 3, 5))
data

1    a
3    b
5    c
dtype: object

# 取值操作是显式索引
data[1]

'a'

# 切片操作是隐式索引
data[1:3]

3    b
5    c
dtype: object

Pandas提供的索引器(indexer)属性来取值的方法不是Series对象的函数方法,而是暴露切片接口的属性。

第一种索引器是loc属性,表示取值和切片都是显式的:

data.loc[1]

'a'

data.loc[1:3]

1    a
3    b
dtype: object

第二种是iloc属性,表示取值和切片都是Python形式(从0开始,左闭右开区间)的隐式索引:

data.iloc[1]

'b'

data.iloc[1:3]

3    b
5    c
dtype: object

第三种取值属性是ix,它是前两种索引器的混合形式。在Series对象中ix等价于标准的[](Python列表)取值方式。

在处理整数索引的对象时,强烈推进使用索引器,可以让代码阅读和理解起来更容易,也能避免因误用索引/切片而产生的小bug。

DataFrame数据选择方法

将DataFrame看作字典,

把DataFrame当作一个由若干Series对象构成的字典。

area = pd.Series({'Guangzhou':55555, 'Shenzhen':44444, 'Dongguan':33333, 'Foshan':22222, 'Zhuhai':11111})
pop = pd.Series({'Guangzhou':51, 'Shenzhen':42, 'Dongguan':33, 'Foshan':24, 'Zhuhai':15})
data = pd.DataFrame({'area':area, 'pop':pop})
data

area pop
Dongguan 33333 33
Foshan 22222 24
Guangzhou 55555 51
Shenzhen 44444 42
Zhuhai 11111 15

两个Series分别构成DataFrame的一列,可以通过对列名进行字典型是的取值获取数据。

data['area']

Dongguan     33333
Foshan       22222
Guangzhou    55555
Shenzhen     44444
Zhuhai       11111
Name: area, dtype: int64

# 用字典形式语法调整对象
data['density'] = data['pop']/data['area']
data

area pop density
Dongguan 33333 33 0.000990
Foshan 22222 24 0.001080
Guangzhou 55555 51 0.000918
Shenzhen 44444 42 0.000945
Zhuhai 11111 15 0.001350

将DataFrame看作二维数组,

data.values

array([[  3.33330000e+04,   3.30000000e+01,   9.90009900e-04],
       [  2.22220000e+04,   2.40000000e+01,   1.08001080e-03],
       [  5.55550000e+04,   5.10000000e+01,   9.18009180e-04],
       [  4.44440000e+04,   4.20000000e+01,   9.45009450e-04],
       [  1.11110000e+04,   1.50000000e+01,   1.35001350e-03]])

data.T

Dongguan Foshan Guangzhou Shenzhen Zhuhai
area 33333.00000 22222.00000 55555.000000 44444.000000 11111.00000
pop 33.00000 24.00000 51.000000 42.000000 15.00000
density 0.00099 0.00108 0.000918 0.000945 0.00135
data.values[0]

array([  3.33330000e+04,   3.30000000e+01,   9.90009900e-04])

data['area']

Dongguan     33333
Foshan       22222
Guangzhou    55555
Shenzhen     44444
Zhuhai       11111
Name: area, dtype: int64

Pandas索引器loc、iloc和ix,

通过iloc索引器,像对待Numpy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。

data.iloc[:3, :2]

area pop
Dongguan 33333 33
Foshan 22222 24
Guangzhou 55555 51
data.loc[:'Guangzhou', :'pop']

area pop
Dongguan 33333 33
Foshan 22222 24
Guangzhou 55555 51
# ix索引器实现混合效果
data.ix[:3, :'pop']

D:\Anaconda3\envs\py36env\lib\site-packages\ipykernel_launcher.py:2: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated

area pop
Dongguan 33333 33
Foshan 22222 24
Guangzhou 55555 51

loc属性,表示取值和切片都是显式的。

data.loc[data.index[[0,2]], ['area', 'pop']]

area pop
Dongguan 33333 33
Guangzhou 55555 51
data.loc[data.index[[0,2]], 'area':'pop']

area pop
Dongguan 33333 33
Guangzhou 55555 51
data.loc[:, ['area', 'pop']]

area pop
Dongguan 33333 33
Foshan 22222 24
Guangzhou 55555 51
Shenzhen 44444 42
Zhuhai 11111 15
data.loc[:'Guangzhou', :'pop']

area pop
Dongguan 33333 33
Foshan 22222 24
Guangzhou 55555 51

iloc属性,表示取值和切片都是Python形式的(从0开始,左闭右开区间)隐式索引。

data.iloc[[0,2], data.columns.get_loc('pop')]

Dongguan     33
Guangzhou    51
Name: pop, dtype: int64

data.iloc[0:2, data.columns.get_indexer(['area', 'pop'])]

area pop
Dongguan 33333 33
Foshan 22222 24
data.iloc[0:2, 0:2]

area pop
Dongguan 33333 33
Foshan 22222 24

如果对单个标签取值就选择列,而对多个标签用切片就选择行。

data['area']

Dongguan     33333
Foshan       22222
Guangzhou    55555
Shenzhen     44444
Zhuhai       11111
Name: area, dtype: int64

data['Dongguan':'Guangzhou']

area pop density
Dongguan 33333 33 0.000990
Foshan 22222 24 0.001080
Guangzhou 55555 51 0.000918

本文首发于steem,感谢阅读,转载请注明。

https://steemit.com/@padluo

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

推荐阅读更多精彩内容