Pandas Practice

pandas是一个方便易用的Python数据处理库,数据科学家们的利器之一哦。

本文简要介绍pandas的一些常用方法。

1 语法——创建DataFrames

import pandas as pd

Ex 1.1 由字典创建DataFrames

df = pd.DataFrame(
{"a":[4,5,6],    #每一列的数据
 "b":[7,8,9]},
index = [1,2,3]) #行索引
df

Ex 1.2 由数组创建DataFrames

df = pd.DataFrame(
[[4,7],
[5,8],
[6,9]],
index = [1,2,3],
columns = ['a','b'])
df

Ex 1.3 多重索引的DataFrames

df = pd.DataFrame(
{"a":[4,5,6],"b":[7,8,9]},
index = pd.MultiIndex.from_tuples(
[('d',1),('d',2),('e',2)]))
df

2 Reshaping Data ——改变数据集的布局

Ex 2.1 pd.melt

考虑一个DataFrame, 某些列为ID变量id_vars,其余列为测量的变量value_vars; 测量变量列被逆透视为行,最终除了ID列只剩下两列variablevalue。这个函数起名为融化melt,名副其实——将许多列消融至两列,胖胖表变成瘦瘦表的视觉效果。

[使用场景]:适合用于将高维特征转化为 Event Log(ID,FeatX,x)

df = pd.DataFrame(
{"a":[1,2,3],"b":[4,5,6],"c":[7,8,9]},
index = [1,2,3])
df
pd.melt(df,id_vars=['a'])

Ex 2.2 df.pivot

[使用场景]:与melt相反,pivot将行组织成紧凑的列,适合将Event log 转化为 高维特征矩阵。

考虑这么一个DataFrame

df = pd.DataFrame({'foo': ['one','one','one','two','two','two'],
                               'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                               'baz': [1, 2, 3, 4, 5, 6]})

对foo列进行bar透视,即将foo这一列变成新的行索引,bar这一列变成列索引,这样我们就可以清晰地看见foo列和bar列的关系


df.pivot(index = 'foo',columns = 'bar',values = 'baz')

Ex 2.3 pd.concat

向DataFrame中添加行或列

pd.concat([df,df])#注意数组
pd.concat([df,df],axis = 1)

Ex 2.4 df.unstack

对于一个多索引的DataFrame来说,我们可以将某一个层级的索引“解”出来——变为列。

df.index.get_level_values(1)
new_df = df[['value']].unstack(level=-1).fillna(False) # level=-1选择最里面的索引层
new_df.columns = new_df.columns.get_level_values(1) # 取最里层列索引作为新的列

Ex 2.5 Else

  • 排序 df.sort_values
  • 设置索引 df.reset_index 将索引置为行号,原索引变成列
  • 调整索引 df.reindex(index=new_index),向原来的索引中加入或者删除项
  • 重命名列 df.rename
  • 丢弃列 df.drop(axis=1)
df
df.sort_values('bar',ascending=False)
df.sort_index()
df.reset_index()
df.rename(columns = {"foo":"conan"})
df.drop(['foo'],axis =1)

3 Subset Observations ——行

  • 头几行
  • 尾几行
  • 去重
  • 逻辑准则
  • 采样
  • 按位置选择
  • 按序选择(最大 最小)
df.head(2)
df.tail(2)
df.drop_duplicates()
df.sample(frac = 0.2)
df.sample(2)
df.iloc[2:3]#与python数组类似
df.nlargest(2,'baz')
df.nsmallest(2,'baz')
df[df.baz > 1]

4 Subset Variables——列

  • 选择一列
  • 选择多列
  • 选择列名匹配给定正则表达式的列
  • 按位置选列

Ex 4.1 比较 iloc loc ix

  • loc 只能处理index的label
  • iloc 只能处理index的位置,因此只接受整数
  • ix 试图像loc一样通过label处理index,失败时就如同iloc
df.foo
0    one
1    one
2    one
3    two
4    two
5    two
Name: foo, dtype: object
df[['foo','bar']]
df.filter(regex='o$')
df.loc[:,'bar':'foo']
df.iloc[:,[0,1]]
df.loc[df['baz'] > 1, ['foo','bar']]

5 Summarize Data

  • 统计unique值的出现频率 df.column_name.value_counts()
  • 每一列的描述性统计 df.decribe
  • 常用summary functions
    • 处理各种pandas对象:DataFrame columns,Series,GroupBy,Expanding,Rolling
    • 每个group得到单独的一个值
    • 当应用到DataFrame时,返回Series

其中apply函数需要指定axis
* 0 or 'index': apply function to each column
* 1 or 'columns': apply function to each row

df.foo.value_counts()
two    3
one    3
Name: foo, dtype: int64
df.describe()
type(df.sum())
pandas.core.series.Series
df
image.png
def myfunc(row):
    #print(row)
    #print(type(row))
    print(row.foo)
    return"finished"

df.apply(myfunc,axis=1)#注意指定axis
one
one
one
two
two
two





0    finished
1    finished
2    finished
3    finished
4    finished
5    finished
dtype: object

6 缺失值

  • dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
  • fillna

7 创建新变量

  • df.assign 给DataFrame添加新的一列,返回一个新的dataframe
  • 也可直接df['new_col']
  • pd.qcut(df.col,q,labels,precision)按分位数离散化数据
  • df.clip 阈值化
df = df.assign(Area = lambda df:df.bar+df.foo)
df
df['Volumn'] = df.Area + df.foo
df
pd.cut(df.baz,3,retbins=True)#分成3类
(0    (0.995, 2.667]
 1    (0.995, 2.667]
 2    (2.667, 4.333]
 3    (2.667, 4.333]
 4        (4.333, 6]
 5        (4.333, 6]
 Name: baz, dtype: category
 Categories (3, object): [(0.995, 2.667] < (2.667, 4.333] < (4.333, 6]],
 array([ 0.995     ,  2.66666667,  4.33333333,  6.        ]))
df.baz.clip(lower=2,upper=3)
0    2
1    2
2    3
3    3
4    3
5    3
Name: baz, dtype: int64

8 Group Data

  • df.groupby(by='col')按列分组
  • df.groupby(level='ind')按某层级的索引分组

分组后返回的GroupBy Object

  • size 求分组大小
  • agg 使用函数对小组进行聚合
  • 上述的summarize函数
  • 应用到每个group,然后返回和原来的DataFrame一样大小的DataFrame
    • df.shift(1)
    • df.shift(-1)
    • rank(method='dense')返回排序后的rank值
    • rank(method='min')相等值取最小的rank值
    • ...
    • cumsum
    • cummax
    • cummin
    • cumprod
df
df.groupby('foo').shift(1)#分组,每组都移动
df.groupby('foo').rank(method = 'dense')
df.rank(method = 'dense')
df.rank(method = 'min')
df.rank(pct=True)
df.baz.rank(method = 'first')
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
5    6.0
Name: baz, dtype: float64

9 Windows

  • expanding累积窗
  • rolling滑动窗 moving average curve with variance as shades
df.expanding(2).sum()
df.expanding(1).sum()
df.expanding(3).sum()
image.png
import numpy as np
df = pd.DataFrame(np.random.randn(1000,4),
                 index = pd.date_range('1/1/2000', periods=1000),
                 columns = ['A', 'B', 'C', 'D'])
df = df.cumsum()
df.rolling(window=60).sum().plot(subplots=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7fadbc4c5b70>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7fadbc441e10>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7fada8c15ef0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7fada8bea048>], dtype=object)
import matplotlib.pyplot as plt
plt.show()

10 绘图

df.plot.hist()
<matplotlib.axes._subplots.AxesSubplot at 0x7fada8a66518>
plt.show()
df.plot.scatter(x='A',y='B')
<matplotlib.axes._subplots.AxesSubplot at 0x7fada8905240>
plt.show()

11 Combine Data Sets

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

推荐阅读更多精彩内容