pandas索引

示例数据

import pandas as pd
import numpy as np

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

df
Out[4]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
b -0.952455 -0.346255 -0.312078 -0.630422
c  0.110058 -0.269850 -0.079302  1.623259
d -0.039426 -1.077963  2.209573 -0.586103
e -0.502600 -1.523090 -0.925981 -1.787723
f -0.364452  1.044349  0.063757  1.087364

1. 读取行

1.1 使用 df[ xxx ]

  • xxx可以是:
    整数切片、行标签切片、布尔数组(大小与行数一致)。
  • 注意:xxx不能是单个整数或单个行标签名称!
# 使用整数切片
df[0:3]     # 获取[0,3)行
Out[6]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
b -0.952455 -0.346255 -0.312078 -0.630422
c  0.110058 -0.269850 -0.079302  1.623259

#使用行标签切片
df['a':'c']    # 获取'a'到'c'之间的所有行
Out[7]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
b -0.952455 -0.346255 -0.312078 -0.630422
c  0.110058 -0.269850 -0.079302  1.623259

# 使用布尔数组
df[[True, True, True, False, False, False]]    # 获取True部分的行(布尔数组长度等于行数)
Out[8]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
b -0.952455 -0.346255 -0.312078 -0.630422
c  0.110058 -0.269850 -0.079302  1.623259

1.2 使用 df.loc[xxx, :]

  • xxx可以是:
    行标签、行标签切片、行标签列表、布尔数组(大小与行数一致)。
  • 与df[]不同,这里可以使用单个行标签和行标签列表,但是不能使用整数索引!
# 使用行标签
df.loc['a', :]    # 'a'行的所有列
Out[15]: 
A   -0.367292
B   -0.840408
C   -0.929649
D   -0.255093
Name: a, dtype: float64

# 使用行标签切片
df.loc['a':'d', :]    # 'a'到'd'行的所有列
Out[16]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
b -0.952455 -0.346255 -0.312078 -0.630422
c  0.110058 -0.269850 -0.079302  1.623259
d -0.039426 -1.077963  2.209573 -0.586103

# 使用行标签列表
df.loc[['a','d','c'], :]    # 'a'、'd'、'c'行的所有列
Out[17]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
d -0.039426 -1.077963  2.209573 -0.586103
c  0.110058 -0.269850 -0.079302  1.623259

# 使用布尔数组
df.loc[[True, True, True, False, False, False], :]    # True对应行的所有列
Out[18]: 
          A         B         C         D
a -0.367292 -0.840408 -0.929649 -0.255093
b -0.952455 -0.346255 -0.312078 -0.630422
c  0.110058 -0.269850 -0.079302  1.623259

1.3 使用 df.iloc[xxx, :]

  • xxx可以是:
    整数索引、整数切片、整数列表、布尔数组(大小与行数一致)。
  • 与 df.loc[]相比,这里不能使用行标签!
# 使用整数索引
df.iloc[3, :]
Out[14]: 
A   -0.241166
B    0.615707
C    0.359840
D   -0.094143
Name: d, dtype: float64

# 使用整数索引切片
df.iloc[0:3, :]
Out[15]: 
          A         B         C         D
a  1.001490  2.378449 -1.729667 -0.182641
b -1.619742 -0.410464  0.597602  0.757170
c  0.274450 -0.235636  0.335355 -1.074311

# 使用整数索引列表
df.iloc[[0,2,4], :]
Out[16]: 
          A         B         C         D
a  1.001490  2.378449 -1.729667 -0.182641
c  0.274450 -0.235636  0.335355 -1.074311
e  1.218529 -1.100026 -0.478061  0.804759

# 使用布尔数组
df.iloc[[True,True,True,False,False,False], :] # 前三行(布尔数组长度等于行数)
Out[17]: 
          A         B         C         D
a  1.001490  2.378449 -1.729667 -0.182641
b -1.619742 -0.410464  0.597602  0.757170
c  0.274450 -0.235636  0.335355 -1.074311

1.4 使用 df.ix[ xxx, :]

  • xxx可以是:
    整数索引、整数切片、整数列表、
    标签索引、标签切片、标签列表、
    布尔数组
  • 但是,它已经被弃用,被 loc、iloc替代了。

2. 读取列

2.1 使用 df[ yyy ]

  • yyy可以是:
    列标签索引、列标签列表。
  • 注意:没有列标签切片!
# 使用列标签索引
df['A']				# 获取一列
Out[13]: 
a   -0.367292
b   -0.952455
c    0.110058
d   -0.039426
e   -0.502600
f   -0.364452
Name: A, dtype: float64

# 使用列标签列表
df[['A', 'B']]		# 获取多列,传入列标签列表
Out[14]: 
          A         B
a -0.367292 -0.840408
b -0.952455 -0.346255
c  0.110058 -0.269850
d -0.039426 -1.077963
e -0.502600 -1.523090
f -0.364452  1.044349

# 注意:没有df['A':'C']这种获取列的方式!

2.2 使用 df.loc [:, yyy ]

  • yyy可以是:
    列标签索引、列标签切片、列标签列表、布尔数组(大小与列数一致)。
# 使用列标签索引
df.loc[:, 'A']    # 所有行的'A'列
Out[20]: 
a   -0.367292
b   -0.952455
c    0.110058
d   -0.039426
e   -0.502600
f   -0.364452
Name: A, dtype: float64

# 使用列标签切片
df.loc[:, 'A':'C']
Out[22]: 
          A         B         C
a -0.367292 -0.840408 -0.929649
b -0.952455 -0.346255 -0.312078
c  0.110058 -0.269850 -0.079302
d -0.039426 -1.077963  2.209573
e -0.502600 -1.523090 -0.925981
f -0.364452  1.044349  0.063757

# 使用列标签列表
df.loc[:, ['A','B','C']]
Out[26]: 
          A         B         C
a -0.367292 -0.840408 -0.929649
b -0.952455 -0.346255 -0.312078
c  0.110058 -0.269850 -0.079302
d -0.039426 -1.077963  2.209573
e -0.502600 -1.523090 -0.925981
f -0.364452  1.044349  0.063757

# 使用布尔数组
df.loc[:, [True,True,True,False]] # 前三列(布尔数组长度等于列数)
Out[27]: 
          A         B         C
a -0.367292 -0.840408 -0.929649
b -0.952455 -0.346255 -0.312078
c  0.110058 -0.269850 -0.079302
d -0.039426 -1.077963  2.209573
e -0.502600 -1.523090 -0.925981
f -0.364452  1.044349  0.063757

2.3 使用 df.iloc[:, yyy ]

  • yyy可以是:
    整数索引、整数切片、整数列表、布尔数组(大小与列数一致)。
  • 与 df.loc[]比,这里不能使用列标签名称的操作方式。
# 使用整数索引
df.iloc[:, 1]
Out[20]: 
a    2.378449
b   -0.410464
c   -0.235636
d    0.615707
e   -1.100026
f    1.906904
Name: B, dtype: float64

# 使用整数切片
df.iloc[:, 0:3]
Out[21]: 
          A         B         C
a  1.001490  2.378449 -1.729667
b -1.619742 -0.410464  0.597602
c  0.274450 -0.235636  0.335355
d -0.241166  0.615707  0.359840
e  1.218529 -1.100026 -0.478061
f -0.271933  1.906904 -1.674859

# 使用整数列表
df.iloc[:, [0,1,2]]
Out[22]: 
          A         B         C
a  1.001490  2.378449 -1.729667
b -1.619742 -0.410464  0.597602
c  0.274450 -0.235636  0.335355
d -0.241166  0.615707  0.359840
e  1.218529 -1.100026 -0.478061
f -0.271933  1.906904 -1.674859

# 使用布尔数组
df.iloc[:, [True,True,True,False]] # 前三列
Out[23]: 
          A         B         C
a  1.001490  2.378449 -1.729667
b -1.619742 -0.410464  0.597602
c  0.274450 -0.235636  0.335355
d -0.241166  0.615707  0.359840
e  1.218529 -1.100026 -0.478061
f -0.271933  1.906904 -1.674859

2.4 使用 df.ix[:, yyy ]

  • 同上,已被废弃。

3. 精确定位单元格

3.1 使用 df.at[行标签, 列标签]

df.at['a', 'A']
Out[24]: 1.0014897784142178

3.2 使用 df.iat[ 行整数索引, 列整数索引 ]

df.iat[0, 0]
Out[25]: 1.0014897784142178

总结:

  • 获取行:df.loc[xxx, :]是针对以行标签方式获取而设计,df.iloc[xxx, :]针对整数索引方式而设计。
  • 获取列:df.loc[:, yyy]是针对以列标签方式获取而设计,df.iloc[:, yyy]针对整数索引方式而设计。
  • 不论是df.loc[],还是df.iloc[],两者都可以使用布尔数组方式获取数据,但要注意数组大小需和行数/列数相等。
  • 只要df.loc[]/df.iloc[]中的":"替换为相应的行索引或列索引方式,则可以获取DataFrame中的一块区域。

参考文章:https://www.cnblogs.com/hhh5460/p/5595616.html

猜你喜欢

转载自blog.csdn.net/fcku_88/article/details/84479983