pandas 学习心得(2):选择数据的操作

简书阅读体验不佳(与有道云笔记的markdown解析不同),因此建议进入传送门
jupyter notebook:pandas 学习心得(2):选择数据的操作

这个系列是我学习《python数据科学手册》所做的笔记
用于个人备忘
顺便分享,因此存在不严谨的地方或者述说不清晰的地方

Series数据选择方法

  • 索引
  • 切片
  • 掩码(布尔索引)
  • 花式索引
  • 索引器 loc、iloc、ix
import numpy as np
import pandas as pd
data = pd.Series([0.25,0.5,0.75,1],
                index = ['a', 'b', 'c', 'd'])
data
a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64

1. 索引

索引即获取一个标量
索引方法有两种,1)将Series 对象看作字典. 2) 将Series看作一维数组

data['b']  # 看作字典
0.5
data[1]  # 看作一维数组
0.5

2. 切片

切片即获取一组数据(个数大于1)
切片方法有两种: 1)将Series 对象看作字典. 2) 将Series看作一维数组

data['b':'d']  # 看作字典,包含两个端点, 显式索引
b    0.50
c    0.75
d    1.00
dtype: float64
data[0:2]  # 看作一维数组,左闭右开区间, 隐式索引
a    0.25
b    0.50
dtype: float64

3. 掩码(布尔索引)

data[(data > 0.3) & (data < 0.8)]
b    0.50
c    0.75
dtype: float64

4. 花式索引

使用花式索引,结果的形状与索引数组形状一致,而不是与被索引数组的形状一致

select = np.array([[0,1],
                     [2,3]])
select
array([[0, 1],
       [2, 3]])
data[select]  # 花式索引,结果形状与select一致
array([[0.25, 0.5 ],
       [0.75, 1.  ]])

5. 索引器

切片、索引的两种不同方式(显示索引 与 隐式索引) 经常会引起混乱
例如,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,显式索引
'a'
data[1:3] # 结果为 b c , 隐式索引
3    b
5    c
dtype: object

上述方法容易引起混淆,所以pandas提供了索引器
第一种索引器是 loc, 表示显式

data.loc[1]
'a'
data.loc[3:5]
3    b
5    c
dtype: object

第二种索引器是iloc,表示隐式

data.iloc[0]
'a'
data.iloc[0:2]  # 左闭右开
1    a
3    b
dtype: object

第三种索引器是ix ,它相当于标准的[]取值方式,是前两种索引器的混合形式,多用于DataFrame中,此处不推荐

DataFrame数据选取方法

  1. 将DataFrame 看作字典
  2. 将DataFrame 看作二维数组
x = {'a': 10,'b':20, 'c':30}
y = {'a':2, 'b':4, 'c':6}
data = pd.DataFrame({'x':x,'y':y})
data

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>x</th>
<th>y</th>
</tr>
</thead>
<tbody>
<tr>
<th>a</th>
<td>10</td>
<td>2</td>
</tr>
<tr>
<th>b</th>
<td>20</td>
<td>4</td>
</tr>
<tr>
<th>c</th>
<td>30</td>
<td>6</td>
</tr>
</tbody>
</table>
</div>

1. 将DataFrame看作字典

通过对 列名 进行字典形式的取值获取数据

data['x']
a    10
b    20
c    30
Name: x, dtype: int64

也可以使用属性形式访问

data.x
a    10
b    20
c    30
Name: x, dtype: int64

注意,如果要修改值, 可以用 data['x'] = wtf, 但不要使用 data.x = wtf

还可以增加一列

data['z'] = data['x'] + data['y']
data

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>x</th>
<th>y</th>
<th>z</th>
</tr>
</thead>
<tbody>
<tr>
<th>a</th>
<td>10</td>
<td>2</td>
<td>12</td>
</tr>
<tr>
<th>b</th>
<td>20</td>
<td>4</td>
<td>24</td>
</tr>
<tr>
<th>c</th>
<td>30</td>
<td>6</td>
<td>36</td>
</tr>
</tbody>
</table>
</div>

2. 将DataFrame 看作二维数组

这种方法比较实用
类比二维numpy 数组, 查看数组的values属性

data.values
array([[10,  2, 12],
       [20,  4, 24],
       [30,  6, 36]], dtype=int64)

进行转置

data.T  # 转置,创建新的副本

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
<tbody>
<tr>
<th>x</th>
<td>10</td>
<td>20</td>
<td>30</td>
</tr>
<tr>
<th>y</th>
<td>2</td>
<td>4</td>
<td>6</td>
</tr>
<tr>
<th>z</th>
<td>12</td>
<td>24</td>
<td>36</td>
</tr>
</tbody>
</table>
</div>

在进行数组形式的取值时,就可以用上述的索引器 loc, iloc, ix

data.iloc[0:2]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>x</th>
<th>y</th>
<th>z</th>
</tr>
</thead>
<tbody>
<tr>
<th>a</th>
<td>10</td>
<td>2</td>
<td>12</td>
</tr>
<tr>
<th>b</th>
<td>20</td>
<td>4</td>
<td>24</td>
</tr>
</tbody>
</table>
</div>

data.loc['b']
x    20
y     4
z    24
Name: b, dtype: int64

在loc索引器中结合掩码与花式索引

data.loc[data.z > 20, ['x','y']]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>x</th>
<th>y</th>
</tr>
</thead>
<tbody>
<tr>
<th>b</th>
<td>20</td>
<td>4</td>
</tr>
<tr>
<th>c</th>
<td>30</td>
<td>6</td>
</tr>
</tbody>
</table>
</div>

data.loc[['a','b'],['y','z']]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>y</th>
<th>z</th>
</tr>
</thead>
<tbody>
<tr>
<th>a</th>
<td>2</td>
<td>12</td>
</tr>
<tr>
<th>b</th>
<td>4</td>
<td>24</td>
</tr>
</tbody>
</table>
</div>

注意

如果对单个标签取值,就选择列,如果大队多个标签切片,就选择行

data['x']  # 如果输入 data['a']  就报错,可以试试
a    10
b    20
c    30
Name: x, dtype: int64
data['a':'c']  # 如果输入 data['x':'y'] ,不是你想要的结果

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>x</th>
<th>y</th>
<th>z</th>
</tr>
</thead>
<tbody>
<tr>
<th>a</th>
<td>10</td>
<td>2</td>
<td>12</td>
</tr>
<tr>
<th>b</th>
<td>20</td>
<td>4</td>
<td>24</td>
</tr>
<tr>
<th>c</th>
<td>30</td>
<td>6</td>
<td>36</td>
</tr>
</tbody>
</table>
</div>

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

推荐阅读更多精彩内容