Pandas学习笔记系列:html
原文:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/3-2-pd-indexing/ 有删改python
下面例子是以 6X4 的矩阵数据为基础进行介绍git
dates = pd.date_range('20130101', periods=6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D']) """ A B C D 2013-01-01 0 1 2 3 2013-01-02 4 5 6 7 2013-01-03 8 9 10 11 2013-01-04 12 13 14 15 2013-01-05 16 17 18 19 2013-01-06 20 21 22 23 """
若是咱们想选取DataFrame中的数据,下面描述了两种途径, 他们都能达到同一个目的:github
print(df['A']) print(df.A) """ 2013-01-01 0 2013-01-02 4 2013-01-03 8 2013-01-04 12 2013-01-05 16 2013-01-06 20 Freq: D, Name: A, dtype: int64 """
让选择跨越多行或多列:学习
print(df[0:3]) """ A B C D 2013-01-01 0 1 2 3 2013-01-02 4 5 6 7 2013-01-03 8 9 10 11 """ print(df['20130102':'20130104']) """ A B C D 2013-01-02 4 5 6 7 2013-01-03 8 9 10 11 2013-01-04 12 13 14 15 """
若是df[3:3]将会是一个空对象。后者选择2013-01-02
到2013-01-04
标签之间的数据,而且包括这两个标签。spa
另外在实验中我尝试过df['2013-01-04']
和df['20130104']
都会报错,报错信息是没有这两个key。因此我进一步作以下实验:code
df2 = pd.DataFrame([[0,1],[2,3]],index=['a','b'], columns=['b','a']) print(df2) """ b a a 0 1 b 2 3 """
print(df2.a) """ a 1 b 3 Name: a, dtype: int64 """ print(df2['b']) """ a 0 b 2 Name: b, dtype: int64 """
能够看到这种方式是获取列元素。htm
print(df2['a':]) """ b a a 0 1 b 2 3 """ print(df2['b':]) """ b a b 2 3 """
能够看到使用:
的这种方式能够获取行元素。对象
固然这种使用标签名来指定范围的方法明显很麻烦,另外有个很明显的缺点就是若是有两个标签是相同的时候,你就无法用标签来指定起始范围了。因此咱们还能够用数字来指定范围,例如在该例子中df[1:]
是等价于df['b':]
的。blog
另外这两种方式也存在一些区别,就是最后的一个元素,若是使用的是数字,则不会选择到,反之若是用标签则会选择,看例子更好明白:
print(df2['a':'b']) """ b a a 0 1 b 2 3 """ print(df2[0:1]) """ b a a 0 1 """
看了上面介绍的方法你可能有点晕头转向,因此也不推荐上面的索引方法。你能够参考以下几种方法来对数据进行筛选。
loc
咱们能够使用标签来选择数据 loc
, 也就是说这种状况下你不能再使用数字进行索引了。本例子主要经过标签名字选择某一行数据, 或者经过选择某行或者全部行(:表明全部行)而后选其中某一列或几列数据。:
print(df.loc['20130102']) """ A 4 B 5 C 6 D 7 Name: 2013-01-02 00:00:00, dtype: int64 """ print(df.loc[:,['A','B']]) """ A B 2013-01-01 0 1 2013-01-02 4 5 2013-01-03 8 9 2013-01-04 12 13 2013-01-05 16 17 2013-01-06 20 21 """ print(df.loc['20130102',['A','B']]) """ A 4 B 5 Name: 2013-01-02 00:00:00, dtype: int64 """
iloc
另外咱们能够采用位置进行选择 :iloc
, 在这里咱们能够经过位置选择在不一样状况下所须要的数据例如选某一个,连续选或者跨行选等操做。
print(df.iloc[3,1]) # 13 print(df.iloc[3:5,1:3]) """ B C 2013-01-04 13 14 2013-01-05 17 18 """ print(df.iloc[[1,3,5],1:3]) """ B C 2013-01-02 5 6 2013-01-04 13 14 2013-01-06 21 22 """
在这里咱们能够经过位置选择在不一样状况下所须要的数据, 例如选某一个,连续选或者跨行选等操做。
ix
:结合loc
和iloc
固然咱们能够采用混合选择 ix, 其中选择’A’和’C’的两列,并选择前三行的数据。
print(df.ix[:3,['A','C']]) """ A C 2013-01-01 0 2 2013-01-02 4 6 2013-01-03 8 10 """
最后咱们能够采用判断指令 (Boolean indexing) 进行选择. 咱们能够约束某项条件而后选择出当前全部数据.
print(df[df.A>8]) """ A B C D 2013-01-04 12 13 14 15 2013-01-05 16 17 18 19 2013-01-06 20 21 22 23 """