data = pd.Series([0.25, 0.5, 0.75, 1.0])
data.values
data.index
- Serise是通用的NumPy数组
- Series是特殊的字典
创建DataFrame对象
(1) 通过单个 Series 对象创建。
pd.DataFrame(population, columns=['population'])
(2) 通过字典列表创建。任何元素是字典的列表都可以变成 DataFrame。
data = [{'a': i, 'b': 2 * i} for i in range(3)]
pd.DataFrame(data)
(3) 通过 Series 对象字典创建。
pd.DataFrame({'population': population,
'area': area})
(4) 通过 NumPy 二维数组创建。
pd.DataFrame(np.random.rand(3, 2),
columns=['foo', 'bar'],
index=['a', 'b', 'c'])
第一种索引器是 loc 属性,表示取值和切片都是显式的:
第二种是 iloc 属性,表示取值和切片都是 Python 形式的 1 隐式索引:
第三种取值属性是 ix,它是前两种索引器的混合形式
data.ix[:3, :'pop']
选择列:
data['Florida':'Illinois']
选择行:
data[1:3]
选择行:
data[data.density > 100]
NumPy 也提供了一些特殊的累计函数,它们可以忽略缺失值的影响:
np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
isnull()
创建一个布尔类型的掩码标签缺失值。
notnull()
与 isnull() 操作相反。
dropna(axis=1, how='all')
返回一个剔除缺失值的数据。
fillna()
返回一个填充了缺失值的数据副本
data.fillna(0)
# 从前往后填充
data.fillna(method='ffill')
# 从后往前填充
data.fillna(method='bfill')
我们可以将一个多级索引数据集转换成简单的二维形式,可以通过 level 参数设置转换的索引层级:
pop.unstack(level=0)
pop.unstack(level=1)
pop.unstack().stack()
索引的设置与重置
pop_flat = pop.reset_index(name='population')
pop_flat.set_index(['state', 'year'])
# 多级索引的数据累计方法
data_mean = health_data.mean(level='year')
data_mean.mean(axis=1, level='type')
Concat与Append操作
包括用数据库那样的连接(join) 与合并(merge)
(1) 捕捉索引重复的错误 verify_integrity=True
(2) 忽略索引 ignore_index=True
(3) 增加多级索引 keys=['x', 'y']
pd.concat([x, y], keys=['x', 'y'])
join='inner' 实现对输入列的交集合并:
pd.concat([df5, df6], join='inner')
直接确定结果使用的列名,设置 join_axes 参数
pd.concat([df5, df6], join_axes=[df5.columns])
合并数据集: 合并与连接
pd.merge() 函数实现了三种数据连接的类型: 一对一、 多对一和多对多。
1. 参数on的用法
pd.merge(df1, df2, on='employee')
2. left_on与right_on参数
有时你也需要合并两个列名不同的数据集
pd.merge(df1, df3, left_on="employee", right_on="name")
你可以通过设置 pd.merge() 中的 left_index 和 / 或 right_index 参数将索引设置为键来实
现合并:
pd.merge(df1a, df2a, left_index=True, right_index=True)
将索引与列混合使用
pd.merge(df1a, df3, left_index=True, right_on='name')
3.设置数据连接的集合操作规则
pd.merge(df6, df7, how='inner')
how 参数支持的数据连接方式还有 'outer'、 'left' 和 'right'。
通过 suffixes 参数自定义后缀名:
pd.merge(df8, df9, on="name", suffixes=["_L", "_R"])
GroupBy: 分割、 应用和组合
GroupBy 中最重要的操作可能就是 aggregate、 filter、 transform 和 apply(累计、过滤、转换、应用)
# 累计
df.groupby('key').aggregate({'data1': 'min', 'data2': 'max'})
# 过滤
def filter_func(x):
return x['data2'].std() > 4
df.groupby('key').filter(filter_func)
# 转换
df.groupby('key').transform(lambda x: x - x.mean())
# 应用
def norm_by_data2(x):
# x是一个分组数据的DataFrame
x['data1'] /= x['data2'].sum()
return x
df.groupby('key').apply(norm_by_data2)
设置分割的键
1. 将列表、 数组、 Series 或索引作为分组键。
L = [0, 1, 0, 1, 2, 0]
df.groupby(L).sum()
2. 用字典或 Series 将索引映射到分组名称。
df2 = df.set_index('key')
mapping = {'A': 'vowel', 'B': 'consonant', 'C': 'consonant'}
df2.groupby(mapping).sum()
3. 任意 Python 函数。
与前面的字典映射类似,你可以将任意 Python 函数传入 groupby,函数映射到索引,然后新的分组输出
df2.groupby(str.lower).mean()
4. 多个有效键构成的列表。
df2.groupby([str.lower, mapping]).mean()
3.10 数据透视表
titanic.pivot_table('survived', index='sex', columns='class')
#1. 多级数据透视表
age = pd.cut(titanic['age'], [0, 18, 80])
titanic.pivot_table('survived', ['sex', age], 'class')
# cut函数是按照数据的值进行分割,而qcut函数则是根据数据本身的数量来对数据进行分割。
fare = pd.qcut(titanic['fare'], 2)
titanic.pivot_table('survived', ['sex', 'age'], [fare, 'class'])
# Pandas 0.18版的函数签名
DataFrame.pivot_table(data, values=None, index=None, columns=None,
aggfunc='mean', fill_value=None, margins=False,
dropna=True, margins_name='All')
titanic.pivot_table(index='sex', columns='class', aggfunc={'survived':sum, 'fare':'mean'})
# 当需要计算每一组的总数时,可以通过 margins 参数来设置:
titanic.pivot_table('survived', index='sex', columns='class', margins=True, margins_name='All')
3.11 向量化字符串操作
3.11.2 Pandas字符串方法列表
monte.str.lower()
3.12.1 Python的日期与时间工具
利用numpy.datetime64 的有效存储和向量化接口将 datetime 和 dateutil 的易用性有机结合
import pandas as pd
date = pd.to_datetime("4th of July, 2015")
date
# 3.12.2 Pandas时间序列: 用时间作索引
index = pd.DatetimeIndex(['2014-07-04', '2014-08-04','2015-07-04', '2015-08-04'])
pd.date_range('2015-07-03', periods=8, freq='H')
pd.period_range('2015-07', periods=8, freq='M')
pd.timedelta_range(0, periods=10, freq='H')
pd.timedelta_range(0, periods=9, freq="2H30T")
3.12.5 重新取样、 迁移和窗口
resample 反映的是上一年的均值,而asfreq 反映的是上一年最后一个工作日的收盘价。
#降采样
goog.resample('BA').mean().plot(style=':')
goog.asfreq('BA').plot(style='--');
#升采样
data.asfreq('D', method='bfill').plot(ax=ax[1], style='-o')
data.asfreq('D', method='ffill').plot(ax=ax[1], style='--o')
#移动时间窗口
rolling = goog.rolling(365, center=True)
3.13 高性能Pandas: eval()与query()
np.allclose(df1 + df2 + df3 + df4,pd.eval('df1 + df2 + df3 + df4'))
Cmean = df['C'].mean()
result1 = df[(df.A < Cmean) & (df.B < Cmean)]
result2 = df.query('A < @Cmean and B < @Cmean')
np.allclose(result1, result2)