示例数据
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