由于平时没有系统的学习pandas,导致在实际应用过程中,对于获取df中的行和列经常出现问题,于是总结一下,供自己以后参考。
参考的书籍在线版链接:利用 Python 进行数据分析 · 第 2 版
请当你看完1-5的内容再来看该部分,用于理解和以后的查询。
功能 | |||
---|---|---|---|
获取列 | df.loc[: , 列名序列] | df.iloc[ : , 列索引序列] | df[列名序列] |
获取行 | df.loc[行名序列] | df.iloc[ 行索引序列] | df[行名:列名] |
获取行和列1 | df.loc[行名序列,列名序列] | df.iloc[ 行索引序列,列索引序列] | |
获取行和列2 | df.loc[行名开始:行名结束,列名开始:列名结束] | df.iloc[行索引开始:行索引结束,列索引开始:列索引结束] |
由列名或者行名(列索引,行索引)组成的列表;
df[['col1','col2']]
df['col1']
。类似于列表的切片,开始:结束,pandas会获取开始->结束之间的行(列)
切片时,loc包含两端点,左闭右闭;iloc不包含结束点,左闭右开
“:”表示行(列)切片的意思,行开始点:行结束点。
loc[行序列,列序列]
分别表示获取指定的行序列和列序列范围的内容(iloc
同理)
当只获取行的时候,列可以省略
当只获取列的时候,行不能省略,可以写作loc[ : , 列索引],意思是所有行都选中
import pandas as pd
# 创建一个df
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four',
'five', 'six'])
frame
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | NaN |
five | 2002 | Nevada | 2.9 | NaN |
six | 2003 | Nevada | 3.2 | NaN |
在学习获取行列之前,我们先了解一下如果获取行和列的索引
# 获取行、列名称的方法
frame.index
Index(['one', 'two', 'three', 'four', 'five', 'six'], dtype='object')
frame.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
首先我们明确两个概念:
名称索引,即使用行和列的名称进行索引
['year', 'state', 'pop', 'debt']
表示的就是名称索引,它表示行和列的名称是啥
整数索引,即使用行和列所在第几行第几列进行索引
整数索引就类似于列表的下标。
df[列名序列]
如果获取一列,我们直接写入列名即可
# 获取一列
frame["year"]
one 2000
two 2001
three 2002
four 2001
five 2002
six 2003
Name: year, dtype: int64
如果获取多列,需要写入多个列名的列表
# 获取多列
frame[['year', 'state']]
year | state | |
---|---|---|
one | 2000 | Ohio |
two | 2001 | Ohio |
three | 2002 | Ohio |
four | 2001 | Nevada |
five | 2002 | Nevada |
six | 2003 | Nevada |
df[列名序列]
不过要使用的语句为:df.loc[]# 获取一行的的方法
frame.loc['one']
year 2000
state Ohio
pop 1.5
debt NaN
Name: one, dtype: object
# 获取多行的方法
frame.loc[['one','two']]
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
frame['one':'two']
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
df.loc[ 行名序列 , 列名序列 ]:获取指定的行序列和列序列的交集,就是把这个区域确定出来
使用loc的时候左侧填写行序列,右侧填写列序列;
此处序列的概念同上,可以是单个名称,也可是一个列表。
只有行序列的时候,右侧可以省略
frame.loc['one',['year','state']]
year 2000
state Ohio
Name: one, dtype: object
# 同时获取指定行和列
frame.loc[['one', 'two'],['year','state']]
year | state | |
---|---|---|
one | 2000 | Ohio |
two | 2001 | Ohio |
df.loc[:,列序列]
,此处的 冒号:,可以理解为切片的含义,即获取所有的行,同时指定列
frame.loc[:, 'year']
one 2000
two 2001
three 2002
four 2001
five 2002
six 2003
Name: year, dtype: int64
我们可以指定行和列切片的起点和终点,左闭右闭区间;
下面代码可以理解为,行从名称为’two’的行开始,一直到最后;列从名称为’year’的列开始一直到最后。
frame.loc['two': , "year":]
year | state | pop | debt | |
---|---|---|---|---|
two | 2001 | Ohio | 1.7 | NaN |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | NaN |
five | 2002 | Nevada | 2.9 | NaN |
six | 2003 | Nevada | 3.2 | NaN |
当然你完全可以指定他的终点
frame.loc['two':'five', 'year':'pop']
year | state | pop | |
---|---|---|---|
two | 2001 | Ohio | 1.7 |
three | 2002 | Ohio | 3.6 |
four | 2001 | Nevada | 2.4 |
five | 2002 | Nevada | 2.9 |
iloc
的使用和loc一致,只不过是将名称索引改为整数索引
整数索引就是使用行和列的下标(索引)进行获取
就像loc,只获取行的时候,列序列完全可以省略,反之则不行。
# 获取第0行
frame.iloc[0]
year 2000
state Ohio
pop 1.5
debt NaN
Name: one, dtype: object
frame.iloc[[0,1]]
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
# 切片获取多行 左闭右开
frame.iloc[0:1]
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
只要将行切片获取全部即可
frame.iloc[:, 1]
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
six Nevada
Name: state, dtype: object
frame.iloc[:, [1, 2]]
state | pop | |
---|---|---|
one | Ohio | 1.5 |
two | Ohio | 1.7 |
three | Ohio | 3.6 |
four | Nevada | 2.4 |
five | Nevada | 2.9 |
six | Nevada | 3.2 |
# 使用切片
frame.iloc[:, 1: 3]
state | pop | |
---|---|---|
one | Ohio | 1.5 |
two | Ohio | 1.7 |
three | Ohio | 3.6 |
four | Nevada | 2.4 |
five | Nevada | 2.9 |
six | Nevada | 3.2 |
方法与loc完全一致,只是换了索引的方式
frame.iloc[[2,3],[1,3]]
### 获取指定行和列范围
frame.iloc[2:, 3:]
debt | |
---|---|
three | NaN |
four | NaN |
five | NaN |
six | NaN |
利用 Python 进行数据分析 · 第 2 版