Pandas基础入门(8)Pandas索引和选择数据

学习汇总:点这里

索引

Python和NumPy索引运算符"[]“和属性运算符”."。 可以在广泛的用例中快速轻松地访问Pandas数据结构。然而,由于要访问的数据类型不是预先知道的,所以直接使用标准运算符具有一些优化限制。

Pandas现在支持三种类型的多轴索引; 这三种类型在下表中提到:

编号索引描述
1.loc()基于标签
2.iloc()基于整数
3.ix()基于标签和整数

1.loc()

Pandas提供了各种方法来完成基于标签的索引。 切片时,也包括起始边界。整数是有效的标签,但它们是指标签而不是位置。.loc()具有多种访问方式,如 :

  1. 单个标量标签
  2. 标签列表
  3. 切片对象
  4. 一个布尔数组

loc需要两个单/列表/范围运算符,用","分隔。第一个表示行,第二个表示列。

>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4),
>>>index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
>>>df.loc[:,'A']
a    0.015860
b   -0.014135
c    0.446061
d    1.801269
e   -1.404779
f   -0.044016
g    0.996651
h    0.764672
Name: A, dtype: float64

>>>df.loc[:,['A','C']]
          A         C
a -0.529735 -1.067299
b -2.230089 -1.798575
c  0.685852  0.333387
d  1.061853  0.131853
e  0.990459  0.189966
f  0.057314 -0.370055
g  0.453960 -0.624419
h  0.666668 -0.433971

>>>df.loc[['a','b','f','h'],['A','C']]
          A         C
a -1.959731  0.720956
b  1.318976  0.199987
f -1.117735 -0.181116
h -0.147029  0.027369

>>>df = pd.DataFrame(np.random.randn(8, 4),
>>>index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
>>>df.loc['a':'h']
          A         B         C         D
a  1.556186  1.765712  1.060657  0.810279
b  1.377965 -0.183283 -0.224379  0.963105
c -0.530016  0.167183 -0.066459  0.074198
d -1.515189 -1.453529 -1.559400  1.072148
e -0.487399  0.436143 -1.045622 -0.029507
f  0.552548  0.410745  0.570222 -0.628133
g  0.865293 -0.638388  0.388827 -0.469282
h -0.690596  1.765139 -0.492070 -0.176074

>>>df.loc['a']>0
A    False
B     True
C    False
D     True
Name: a, dtype: bool

2.iloc()

Pandas提供了各种方法,以获得纯整数索引。像python和numpy一样,第一个位置是基于0的索引。
各种访问方式如下 -

  1. 整数
  2. 整数列表
  3. 系列值
>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4),
>>>index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
>>>df.iloc[[1, 3, 5], [1, 3]]
          B         D
1  0.081257  0.009109
3  1.037680 -1.467327
5  1.106721  0.320468

>>>df.iloc[1:3, :]
          A         B         C         D
1 -0.133711  0.081257 -0.031869  0.009109
2  0.895576 -0.513450 -0.048573  0.698965

>>>df.iloc[:,1:3]
          B         C
0  0.442735 -0.949859
1  0.081257 -0.031869
2 -0.513450 -0.048573
3  1.037680 -0.801157
4 -0.547456 -0.255016
5  1.106721  0.688142
6 -0.466452  0.219914
7  1.583112  0.982030

3.ix()

除了基于纯标签和整数之外,Pandas还提供了一种使用.ix()运算符进行选择和子集化对象的混合方法。

>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
>>>df.ix[:4]
          A         B         C         D
0 -1.449975 -0.002573  1.349962  0.539765
1 -1.249462 -0.800467  0.483950  0.187853
2  1.361273 -1.893519  0.307613 -0.119003
3 -0.103433 -1.058175 -0.587307 -0.114262
4 -0.612298  0.873136 -0.607457  1.047772

>>>df.ix[:,'A']
0 -1.449975
1 -1.249462
2  1.361273
3 -0.103433
4 -0.612298
5  0.341554
6 -0.075717
7 -0.606742
Name: A, dtype: float64

重建索引

重新索引会更改DataFrame的行标签和列标签。重新索引意味着符合数据以匹配特定轴上的一组给定的标签。可以通过索引来实现多个操作 :

  1. 重新排序现有数据以匹配一组新的标签。
  2. 在没有标签数据的标签位置插入缺失值(NA)标记。
>>>import pandas as pd
>>>import numpy as np
>>>iN=20
>>>idf = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
})

#reindex the DataFrame
>>>idf_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
>>>idf_reindexed
            A    C     B
0  2016-01-01  Low   NaN
2  2016-01-03  High  NaN
5  2016-01-06  Low   NaN

1.重建索引与其他对象对齐

有时可能希望采取一个对象和重新索引,其轴被标记为与另一个对象相同。

>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
>>>df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
>>>df1 = df1.reindex_like(df2)
>>>df1
          col1         col2         col3
0    -2.467652    -1.211687    -0.391761
1    -0.287396     0.522350     0.562512
2    -0.255409    -0.483250     1.866258
3    -1.150467    -0.646493    -0.222462
4     0.152768    -2.056643     1.877233
5    -1.155997     1.528719    -1.343719
6    -1.015606    -1.245936    -0.295275

注意 : 在这里,df1数据帧(DataFrame)被更改并重新编号,如df2。 列名称应该匹配,否则将为整个列标签添加NAN。

2.填充时重新加注

reindex()采用可选参数方法,它是一个填充方法,其值如下:

  1. pad/ffill - 向前填充值
  2. bfill/backfill - 向后填充值
  3. nearest - 从最近的索引值填充
>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
>>>df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
>>>df2.reindex_like(df1)
         col1        col2       col3
0    1.311620   -0.707176   0.599863
1   -0.423455   -0.700265   1.133371
2         NaN         NaN        NaN
3         NaN         NaN        NaN
4         NaN         NaN        NaN
5         NaN         NaN        NaN

>>>df2.reindex_like(df1,method='ffill')
         col1        col2        col3
0    1.311620   -0.707176    0.599863
1   -0.423455   -0.700265    1.133371
2   -0.423455   -0.700265    1.133371
3   -0.423455   -0.700265    1.133371
4   -0.423455   -0.700265    1.133371
5   -0.423455   -0.700265    1.133371

3.重建索引时的填充限制

限制参数在重建索引时提供对填充的额外控制。限制指定连续匹配的最大计数。

>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
>>>df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
>>>df2.reindex_like(df1)
         col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2         NaN         NaN         NaN
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN


>>>df2.reindex_like(df1,method='ffill',limit=1)
         col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2   -0.055713   -0.021732   -0.174577
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

4.重命名

rename()方法允许基于一些映射(字典或者系列)或任意函数来重新标记一个轴。

>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
>>>df1
         col1        col2        col3
0    0.486791    0.105759    1.540122
1   -0.990237    1.007885   -0.217896
2   -0.483855   -1.645027   -1.194113
3   -0.122316    0.566277   -0.366028
4   -0.231524   -0.721172   -0.112007
5    0.438810    0.000225    0.435479

>>>df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})
                c1          c2        col3
apple     0.486791    0.105759    1.540122
banana   -0.990237    1.007885   -0.217896
durian   -0.483855   -1.645027   -1.194113
3        -0.122316    0.566277   -0.366028
4        -0.231524   -0.721172   -0.112007
5         0.438810    0.000225    0.435479

选择数据

使用符号

使用多轴索引从Pandas对象获取值可使用以下符号 :

对象索引描述
Seriess.loc[indexer]标量值
DataFramedf.loc[row_index,col_index]标量对象
Panelp.loc[item_index,major_index, minor_index]p.loc[item_index,major_index, minor_index]

注意 - .iloc()和.ix()应用相同的索引选项和返回值。

>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
>>>df[['A','B']]
          A         B
0 -0.767339 -0.729411
1 -0.563540 -0.639142
2  0.873589 -2.166382
3  0.900330  0.253875
4 -0.520105  0.064438
5 -1.452176 -0.440864
6 -0.291556 -0.861924
7 -1.464235  0.313168

>>>df[2:2]
Empty DataFrame
Columns: [A, B, C, D]
Index: []

属性访问

可以使用属性运算符.来选择列。

>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
>>>df.A
0    0.104820
1   -1.206600
2    0.469083
3   -0.821226
4   -1.238865
5    1.083185
6   -0.827833
7   -0.199558
Name: A, dtype: float64
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值