Chybeta

数据挖掘比赛(4)ten Minutes to pandas中文版上

pandas官方文档中有一份快速入门教程《ten Minutes to pandas》,虽然网上早有其中文翻译,不过可能是旧版的:)所以闲来无事,自己也翻译最新版本的学习一下。

这里示例部分都由代码和运行结果图片组成,读者可以直接复制代码来运行;同时为了更清晰,加入了一些小结构标题,所以在小细节处跟官方文档略有不同。本机的运行环境是Python 3.5.2 |Anaconda 4.2.0 (64-bit) ,pandas库的版本为0.19.2,使用jupyter noterbook作为交互环境,对照的这份文档版本为 0.19.2 。这篇文章是对 ten-Minutes-to-pandas的上半部分的翻译。
以下正文开始:

总说

这是一份主要面向新手的对pandas库的简要介绍。想了解更多,你可以通过阅读Cookbook
通常,我们像下面这样导入:

1
2
3
import pandas as pd
import numpy as np
import matplotlib.pylot as plt

导入

创建对象(Object Creadtion)

可以通过查看Data Structure Intro section来获取关于这节的更多内容

创建Series

我们可以通过传递列表(list)来创建 Series,pandas会自动为其生成默认整数索引。

1
2
s = pd.Series([1,3,5,np.nan,6,8])
s

传递列表

创建DataFrame

传递数组

我们可通过传递数组对象(numpy array),时间索引(datetime index)、列标签(labeled columns)来创建 DataFrame

1
2
dates = pd.date_range('20130101',periods=6)
dates

传递数组

1
2
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df

传递字典

我们可以通过传递一个能被转换成类似序列(Serise-like)的字典对象(dict)来创建 DataFrame

1
2
3
4
5
6
7
df2 = pd.DataFrame({ 'A' : 1.,
....: 'B' : pd.Timestamp('20130102'),
....: 'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
....: 'D' : np.array([3] * 4,dtype='int32'),
....: 'E' : pd.Categorical(["test","train","test","train"]),
....: 'F' : 'foo' })
df2

传递字典

它们的列有不同的数据类型

1
df2.dtypes

IPython

如果你使用 IPython ,那么tab键能自动补全 列名(column names)和 属性( public attributes)。下面是能被自动补全的属性的一个子集:

1
df2.


(注:如上图红箭头处按 tab键 )

你可以看到,列名 A 等会被自动补齐……
(原文:As you can see, the columns A, B, C, and D are automatically tab completed. E is there as well; the rest of the attributes have been truncated for brevity。 因为没有做和原文相似的图,所以这句只好:)不翻译了hh )

查看数据(Viewing Data)

查看 Basics section 获得关于这节的更多内容。

查看frame中的头部和尾部部分的行

1
df.head()

查看头部行

1
df.tail()

查看尾部行

显示索引、列名、底层numpy数据(the underlying numpy data)

1
df.index

index

1
df.columns

columns

1
df.values

values
(注:这个values,应该就是把df中的数据直接以numpy array的形式打印出来,注意与前面的 df 命令图片对比一下)

对数据进行快速简单统计

1
df.describe()

describe
(注:count:计数,多少个hh;mean:平均数;std:方差;min:最小值;25%:分位数; 50%:分位数,中位数;75%:分位数;max:最大值)

转置(Transposing)

1
df.T

排序

按轴排序(Sorting by an axis)

1
df.sort_index(axis=1, ascending=True)

Sorting by an axis
(注:axis=1表明按照column来排序,关于axis的讨论参见 Stackoverflow:What does axis in pandas mean?;ascending=False说明要用降序排序,其默认值True代表升序)

按值排序(Sorting by values)

1
df.sort_values(by='B')

Sorting by values
(注:这里没有传入或没有显式指定ascending参数,则其默认值为True,为升序排列。)

选择(Selection)

尽管python/numpy的关于选择(selecting )和设定(setting)的表达式能直接(intuitive)在交互式环境(interactive work)中派上用场,但在实际工作中,我们推荐使用经过优化(optimized)的pandas方法:.at, .iat, .loc, .iloc 和 .ix.

想了解更多请查阅:《Indexing and Selecting Data》《MultiIndex/Advanced Indexing》

获取数据(Getting)

获取列

选择单独的一列,返回一个 Series 对象,相当于 df.A

1
df['A']

df['A']
(注:这里附上 df.A 的结果:df.A

获取行

通过 [ ] 对行进行选取,这操作会对行进行切片(slice)

1
df[0:3]

df[0:3]

1
df['20130102':'20130104']

df['20130102':'20130104']

通过标签选择(Selection by Label)—— .loc

(注:由于写这篇时间过长,jupyter notebook中前面的代码要重新运行一遍,而前面的示例中使用了random函数产生的随机值,所以重新运行后下面的数据会跟上面的数据不太一样,这里放上重新运行后 df值 的图,以作为对照。df

想了解关于本节更多内容请查看 Selection by Label

通过标签获得交叉区域(cross section)

1
df.loc[dates[0]]

dfloc

通过标签进行多轴选择(multi-axis)

1
df.loc[:,['A','B']]

dfmultloc

标签切片,两端确定

1
df.loc['20130102':'20130104',['A','B']]

dfloc2

缩减返回对象的维度

1
df.loc['20130102',['A','B']]

dfloc3

获取标量值

1
df.loc[dates[0],'A']

dfloc4

快速获取标量值

结果与前面一个方法相同

1
df.at[dates[0],'A']

dfat

(注:.loc和 .at运行时间对比如下:locatcmp

通过位置选择(Selection by Position)—— .iloc

想了解本节更多内容请查看 Selection by Position

通过传入整数来选择

1
df.iloc[3]

dfiloc

数值切片,跟numpy/python类似

1
df.iloc[3:5,0:2]

dfloc

传入指定位置(整数)的列表,与numpy/python类似

1
df.iloc[[1,2,4],[0,2]]

dfiloc2

对行切片(slicing rows)

1
df.iloc[1:3,:]

dfiloc3

对列切片(slicing columns)

1
df.iloc[:,1:3]

dfiloc4

取值(标量值)

1
df.iloc[1,1]

dfioc5

更快取值(标量值)

1
df.iat[1,1]

dfiloc6

(注:以下是 .iloc 和 .iat 的时间比较。ilociatcmp

通过布尔表达式进行索引(Boolean Indexing)

使用单独一列来选择数据

1
df[df.A > 0]

bi1

使用 where 操作来选择数据

1
df[df > 0]

(注:虽然没有出现where,但这个确实是where操作)

使用 isin() 方法来过滤数据

1
2
3
4
# 准备工作
df2 = df.copy()
df2['E'] = ['one', 'one','two','three','four','three']
df2

isin1

1
2
# 使用isin()
df2[df2['E'].isin(['two','four'])]

isin2

设置(Setting)

设置新的列,使其数据自动按索引排列

1
2
3
# 准备工作
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
s1


1
2
3
# 设置新的列
df['F'] = s1
df

通过标签(label)来设置数值

1
df.at[dates[0],'A'] = 0

setbylabel

通过位置(position)来设置数值

1
df.iat[0,1] = 0

setbypos

通过指定numpy数组来设置数值

1
df.loc[:,'D'] = np.array([5] * len(df))

setbynparr

经过前面一堆操作后的结果:
dflook

通过 where 操作来设置数值

1
2
3
df2 = df.copy()
df2[df2 > 0] = -df2
df2

setbywhere

处理缺失值(Missing Data)

pandas主要用值 np.nan 来表示缺失值。默认情况下,它不会参与计算。更多内容查看 Missing Data section

重索引(Reindexing)

重索引能让你对特定的轴(axis)来进行索引的改变/添加/删除。它会返回一个复制值(注:也就是说不会改变原本的数据)。

1
2
3
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1.loc[dates[0]:dates[1],'E'] = 1
df1

reindex1

删除所有具有缺失值的行(dropna)

1
df1.dropna(how='any')

dropna

填充缺失值(fillna)

1
df1.fillna(value=5)

fillna

缺失值的布尔表达式(isnull)

1
pd.isnull(df1)

isnull

剩余内容请看:数据挖掘比赛(5)ten Minutes to pandas中文版下

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:数据挖掘比赛(4)ten Minutes to pandas中文版上

文章作者:chybeta

发布时间:2017年02月01日 - 18:02

最后更新:2017年07月06日 - 17:07

原始链接:http://chybeta.github.io/2017/02/01/数据挖掘比赛(4)ten-Minutes-to-pandas中文版上/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。