[TOC]
*****
**索引选取:**
根据某种条件筛选出数据的子集,类似sql那样
整数列表的切片时前闭后开
pandas中标签名称切片是前后都闭合的
超出索引值范围和 标签名不存在会报错
*****
标签指的是索引列中的值
索引选取两种方式:
1.基于loc(根据索引的标签名选取)
2.基于iloc(根据行和列的位置,用整数选取)
*****
loc

没必要使用callable function来进行索引选取
*****
iloc

*****
### 2.1.1. 基于label.loc
**Series操作**
```
#随机生成6个数字,并生成series和索引列
s1 = pd.Series(np.random.randn(6), index=list('abcdef'))
```

*****
根据单个标签名选取数据
```
s1.loc['c']
# 结果
0.7140279186233623
```
*****
根据标签列表选取数据
```
s1.loc[['a','e','f']]
```

*****
根据标签切片选取数据,按照生成时的标签顺序进行切片
```
s1.loc['d':'f']
```

*****
判断s1中的每个元素是否大于0,返回一个布尔数组

根据布尔数组选取数据

**DataFrame操作**
DataFrame是二维数据,可以操控index与column。DataFrame的行索引是整数
*****
根据行和列选取数据

*****
根据列表

*****
根据切片

*****
根据布尔数组选取有关height行的数据
df.loc[df['height'] >= 200,['Player','height']]

下列代码生成的是一个series

*****
### 2.1.2. 基于位置.iloc
用索引的位置下标选取数据

传统切片 通过位置下标整数进行切片

*****
根据列表选取行

根据位置下表整数切片选取行

*****
用Player列作为索引列

*****
用iloc进行选取行或列,只能用 整数位置下标
例子:切片选取行,列表选取列,逗号分割的是行和列的参数

### 2.1.3. 随机选取数据
使用sample()方法对数据进行列或者行的随机选取,默认是对行进行选取。函数接受一个参数用来指定返回的数量或者百分比
```
随机抽取10行
df.sample(10)
```

*****
```
随机返回总数量的百分之一数据
df.sample(frac=0.01)
```

*****
**通过控制axis对列进行抽样**
.head()默认显示前五行
```
随机抽取三列,并显示前五行
df.sample(n = 3,axis = 1).head()
```

*****
sample有一个参数,random_state是随机数种子,决定是否返回固定的随机数据
df.sample(n = 3,axis = 1,random_state=10).head()

*****
### 2.1.4. 使用isin()
该函数回返回一个布尔型向量,根据Series里面的值是否在给定的列表中。通过这个条件筛选出多行数据!
```
# 过滤 "Chicago","New York"
s = df['birth_city']
s.isin(["Chicago","New York"])
```

dataFrame默认按行选取

*****

*****
**对多列进行布尔值选取**
对于DataFrame我们可以使用dict进行处理,dict的key就是对应的column name.
我们经常与all()或者any函数组合进行数据过滤选取
* all 指定axis上的元素全部为True
* any 指定axis上的元素至少一个为True

*****
选出全为true的列

*****
axis= 1是筛选行,axis=0是筛选列
一行中有一个true,这行被标记为true,通过loc返回行


### 2.1.5. 数据过滤
基于loc的强大功能,我们可以对数据做很多复杂的操作。第一个就是实现数据的过滤,类似于SQL里面的where功能选取出height >= 180 ,weight >= 80的运动员数据。
*****
选出符合条件的数据行

*****
* 如果height >= 180, weight >=80, 值为 “high"
* 如果height=170, weight=70 值为 ”msize"
* 其余的值为 "small"
```
#1 新建一个flag列,将符合条件的行的flag列填入"high"值
df.loc[(df['height'] >=180) & (df['weight'] >=80),"flag"] = "high"
```

*****
```
#2 新建一个flag列,将符合条件的行的flag列填入"msize"值
df.loc[((df['height'] <=180) & (df['height']>=170)) & ((df['weight'] <=80) & (df['weight'] >=70)),"flag"] = "msize"
```
*****
```
#3 其余的值为 "small" ~对条件1和2进行否定,不满足条件一或2的。新建一个flag列,将符合条件的行的flag列填入"small"值
df.loc[~(((df['height'] >=180) & (df['weight'] >=80)) |(((df['height'] <=180) & (df['height']>=170))&((df['weight'] <=80) & (df['weight'] >=70)))),"flag"] = "small"
```
*****
对flag列各值的频数进行统计

*****
对各行的height进行条件判断,满足条件,判定该行为true

*****
### 2.1.6. query()方法
使用表达式进行数据筛选.类似sql中的where表达式


**注意**
query里面不可以引用变量

### 2.1.7. 索引设置
set_index()方法可以将一列或者多列设置为索引
```
#keys设置索引列,drop保留作为索引列的数据,append是否保留原来的位置索引,inplace修改原数据集
df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
```
*****
把Player和collage列作为索引列

*****
将索引列放回数据框中,并且设置简单的整数索引
```
df1.reset_index(level=None, drop=False, inplace=False, co_level=0, col_fill='')
```

### 2.1.8. where方法
* 通过布尔类型的数组选取数据仅仅返回数据的子集
* where()函数能够确保返回的结果和原数据集的结构一样
*****
保留符合条件的元素和索引

*****
保留原来数据集的结构

### 2.1.9. 重复数据 duplicate
* duplicated 返回一个和行数相等的布尔数组,表明某一行是否是重复的,true是重复值
* drop_duplicates 删除重复行
*****
**通过keep参数来控制行的取舍**
* 除第一个值外,剩下重复的值都认为是重复值
keep='first' (default): mark / drop duplicates except for the first occurrence.
* 除最后一个值外,剩下重复的值都认为是重复值
keep='last': mark / drop duplicates except for the last occurrence.
* 标记所有的值为重复值
keep=False: mark / drop all duplicates.
*****

*****
```
#判断是否有两行是重复的
df2.duplicated()
```

*****
```
#判断a列是否有重复值
df2.duplicated('a',keep = False)
```



*****
删去重复行

*****
删去a b两列都一样的行。第二行和第四行相等,默认删去第四行

*****
keep = 'last',删去最后一个重复的值之前的值

### 2.1.10. MultiIndex
层次索引可以允许我们操作更加复杂的数据
```
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
根据嵌套列表创建两列索引,第一列索引叫first,第二列索引叫second
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
```
第一列索引有四个值,第二列索引有两个值。第一列索引分为四组,每组有两个相同的值。第二列索引也分为四组,每组有两个不同的值

*****
把数组变为元组

*****
```
#根据元组创建两层索引
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
#得到第一层索引的值
index.get_level_values(0)
```

*****
```
#用随机数创建series值,用建好的多层索引作为series的索引
pd.Series(np.random.randn(8), index=index)
```

*****
**索引选取**
```
#用随机数创建8行4列的数据集。用两层索引index作为数据集的索引。list('ABCD')作为数据集的列
df = pd.DataFrame(np.random.randn(8, 4), index=index,columns = list('ABCD'))
```

*****
```
#用多层索引,类似找书的第几章第几节。章是第一层索引,节是第二层索引
#loc根据索引标签名选取数据 各层索引标签名要放到一个元组里
df.loc[('bar', 'two')]
```

*****
选指定多层索引的行与指定列交叉的数据

*****
多个多层索引放入列表中选取行

*****
选中指定的第一层索引bar下的所有行

*****
对于多层索引,不可以跳过前面层的索引,用后面层的索引选择行。
如:想选所有第二层索引为'one'的行 , 报错

*****
**可以使用切片(slicers)对多重索引进行操作**
* 你可以使用任意的列表,元祖,布尔型作为Indexer
* 可以使用sclie(None)表达在某个level上选取全部的内容,不需要对全部的level进行指定,它们会被隐式的推导为slice(None)
* 所有的axis必须都被指定,意味着index和column上都要被显式的指明
**正确的方式**
~~~python
选取第一层索引A1和第二层索引A3 选取所有的列
df.loc[(slice('A1', 'A3'), ...), :]
~~~
**错误的方式X**
没有选择列
~~~python
df.loc[(slice('A1', 'A3'), ...)]
~~~
*****

*****
```
#slice(None)选择第一层全部索引,'one'选择第二层带'one'的索引,:选择全部的列
df.loc[(slice(None),'one'),:]
```

*****
```
# IndexSlice是一种更接近自然语法的用法,可以替换slice
# 生成IndexSlice
idx = pd.IndexSlice
# idx:选择第一层全部索引。'one' : 第二层'one'索引。: 选择全部的 列。
df.loc[idx[:,'one'],:]
```

*****

*****
**函数xs()可以让我们在指定level的索引上进行数据选取**
level=1 指定为第二层索引,第一层为level=0。选第二层带 'one'索引的数据行




**索引排序**
先排第一层索引,下层索引再组内排序

*****
数据行按第二层索引排序

- 第五节 Pandas数据管理
- 1.1 文件读取
- 1.2 DataFrame 与 Series
- 1.3 常用操作
- 1.4 Missing value
- 1.5 文本数据
- 1.6 分类数据
- 第六节 pandas数据分析
- 2.1 索引选取
- 2.2. 分组计算
- 2.3. 表联结
- 2.4. 数据透视与重塑(pivot table and reshape)
- 2.5 官方小结图片
- 第七节 NUMPY科学计算
- 第八节 python可视化
- 第九节 统计学
- 01 单变量
- 02 双变量
- 03 数值方法
- 第十节 概率
- 01 概率
- 02 离散概率分布
- 03 连续概率分布
- 第一节 抽样与抽样分布
- 01抽样
- 02 点估计
- 03 抽样分布
- 04 抽样分布的性质
- 第十三节 区间估计
- 01总体均值的区间估计:𝝈已知
- 02总体均值的区间估计:𝝈未知
- 03总体容量的确定
- 04 总体比率