## Pandas
### Series 和 DataFrame
```
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
```
* Series 序列 列和行索引,相当于一维数组
* DataFrame 数据帧 列和行 行索引和列标签 相当于二维数组
* 自动对齐 时间序列 缺失补全
* 1 创建序列
* 创建序列
* 创建序列指定索引
* 指定索引名
```
s1 = Series([1, 2, 3, 4, 5])
s1
s2 = Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
s2
s2.index.name = 'index'
s2.index
```
* rand 0-1 随机均匀分布
* randn 标准状态分布 均值0 方差1
* 2 创建数据帧
* 指定索引 指定标签
* 查看索引
* 查看标签
```
df = DataFrame(np.random.rand(4, 4), index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
df
df.index
df.columns
```
### 选择
* 3 序列选择
* 通过序列索引
* 通过自定义索引
* 通过序列索引切片
* 通过自定义索引切片
* 通过序列.iloc(序列索引)
* 通过序列.loc(自定义索引)
```
s2 = Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
s2
s2[0]
s2['a']
s2[0:3]
s2['a':'c']
s2.iloc[0:3]
s2.loc['a':'c']
```
* 4 数据帧获取列
* 获取数据帧某列 数据帧.列标签
* 获取数据帧多列 数据帧[数据帧.columns[index]]
```
df
df.A
df['A']
df[df.columns[0:2]]
```
* 5 数据帧获取多行
* 获取数据帧某行 数据帧.loc[行自定义索引]
* 获取数据帧某行 数据帧.iloc[行索引]
* 获取数据帧多行 数据帧.loc[自定义索引:]
```
df
df.loc['a']
df.loc['a':'b']
df.iloc[0]
```
* 6 数据帧获取多列
* 获取数据帧多列 数据帧.loc[:,自定义列标签]
* 获取数据帧某个具体位置值 数据帧.loc[行索引,列标签]
* 获取数据帧部分 数据帧.loc[行索引:,列标签:]
```
df.loc[:, ['B', 'C', 'D']]
df
df.loc['a', 'A']
df.loc['b':'c', 'B':'C']
```
### 缺失值和数据自动对齐
* 7 序列缺失值
* 产生缺失值 两个序列索引不一样运算产生缺失值
* 求和时 缺失值补全
```
s1 = Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
s1
s2 = Series([2, 3, 4, 5], index=['b', 'c', 'd', 'e'])
s2
s1 + s2
s1.add(s2,fill_value=0)
```
* 8 数据帧缺失值
* 产生缺失值 两个数据帧 形状 行索引 列标签不一样产生缺失值
* 求和时 缺失值补全
```
df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))
df2 = DataFrame(np.arange(12).reshape(3,4), columns=list('ABDE'), index=list('bcd'))
df1
df2
df1 + df2
df1.add(df2, fill_value=0)
```
### 常用运算
* `apply()` 作用于一维向量上
* `applymap()` 作用于所有元素上
* 9 数据帧运算
* 数据帧应用匿名函数列应用
* 数据帧应用匿名函数行应用
```
df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))
df1
f = lambda x: x.max() - x.min()
df1.apply(f)
df1.apply(f, axis=1)
```
* 10 数据帧运算
* 数据帧应用匿名函数作用所有元素
```
df1.applymap(lambda x: x+1)
```
### 常用统计
* 11 数据帧统计运算
* 列元素求和
* 行元素求和
* 求平均
* 查看统计元素
```
df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))
df1
df1.sum()
df1.mean()
df1.sum(axis=1)
df1.describe()
```
### 数据合并和分组
* 12 数据帧
* 两个数据帧拼接
```
df1 = DataFrame(np.random.randn(3, 3))
df2 = DataFrame(np.random.randn(3, 3), index=[5, 6, 7])
df1
df2
pd.concat([df1, df2])
```
* 13 数据帧
* 两个数据帧合并
```
df1 = DataFrame({'user_id': [5348, 13], 'course': [12, 45], 'minutes': [9, 36]})
df2 = DataFrame({'course': [12, 45], 'name': ['Linux 基础入门', '数据分析']})
df1
df2
pd.merge(df1, df2)
```
* 14 数据帧数据统计
* 指定标签值 标签值求和
* 找出指定id,minutes标签值求和
```
df = DataFrame({'user_id': [5348, 13, 5348], 'course': [12, 45, 23], 'minutes': [9, 36, 45]})
df
df[df['user_id'] == 5348]['minutes']
df[df['user_id'] == 5348]
df[df['user_id'] == 5348]['minutes'].sum()
```
* 15 数据帧数据统计
* 过来列id,minute 通过id分组求和
```
df[['user_id', 'minutes']]
df[['user_id', 'minutes']].groupby('user_id').sum()
```
### 时间序列处理
* datetime.datetime 代表时间对象
* datetime.date 代表某一天
* datetime.timedelta 时间差
* 16 时间对象
* 创建时间对象 datetime(年,月,日)
* 加上时间间隔
```
from datetime import datetime, timedelta
d1 = datetime(2017, 8, 1)
d1
delta = timedelta(days=10)
d1 + delta
```
* 17 创建序列
* 创建序列加上时间索引
* 查看序列索引
```
from datetime import datetime
dates = [datetime(2018, 1, 1), datetime(2018, 1, 2), datetime(2018, 1, 3), datetime(2018, 1,4)]
ts = Series(np.random.randn(4), index=dates)
ts
ts.index
ts.index[0]
```
* 18 时间序列索引使用
* 通过时间序列索引找对应的值
```
ts.index[0]
ts[ts.index[0]]
ts['2018-01-01']
ts['2018/01/01']
ts['1/1/2018']
ts[datetime(2018, 1, 1)]
```
* 19 使用pandas生成日期索引
* date_range(起始,结束,freq频率)
```
pd.date_range('2018-1-1', '2019', freq='M')
pd.date_range('2018-1-1', '2018-12-1', freq='MS')
```
* 20 生成时间索引序列
* 使用date_range生成时间索引 频率为小时
* 使用Series生成时间日期序列
```
dates = pd.date_range('2018-1-1', '2018-1-2 23:00:00', freq='H')
ts = Series(np.arange(len(dates)), index=dates)
ts.size
ts.head(5)
ts.tail(5)
```
* 21 高低频统计转化
* 高频转为低频H转为D,求和
* 高频转为低频,求平均
* 高频转低频求平均再转高频求平均
* 高频转低频求平均再转高频求平均无效填充
```
ts.resample('D').sum()
ts.resample('D').mean()
ts.resample('D').mean().resample('H').mean()
ts.resample('D').mean().resample('H').ffill()
```