2021-02-27 pandas

data = pd.Series([0.25, 0.5, 0.75, 1.0])
data.values
data.index
  1. Serise是通用的NumPy数组
  2. 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"])
image.png

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()

image.png

image.png

image.png

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

推荐阅读更多精彩内容