Pandas行和列的获取
由于平时没有系统的学习pandas,导致在实际应用过程中,对于获取df中的行和列经常出现问题,于是总结一下,供自己以后参考。
参考的书籍在线版链接:利用 Python 进行数据分析 · 第 2 版
0 查看手册
请当你看完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的用法
loc[行序列,列序列]
分别表示获取指定的行序列和列序列范围的内容(iloc
同理)
-
当只获取行的时候,列可以省略
-
当只获取列的时候,行不能省略,可以写作loc[ : , 列索引],意思是所有行都选中
1 创建一个DataFrame作为示例
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 |
2 获取行和列索引
在学习获取行列之前,我们先了解一下如果获取行和列的索引
# 获取行、列名称的方法
frame.index
Index(['one', 'two', 'three', 'four', 'five', 'six'], dtype='object')
frame.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
3 常用的索引方式
首先我们明确两个概念:
-
名称索引,即使用行和列的名称进行索引
['year', 'state', 'pop', 'debt']
表示的就是名称索引,它表示行和列的名称是啥 -
整数索引,即使用行和列所在第几行第几列进行索引
整数索引就类似于列表的下标。
4 名称索引获取行列
4.1 获取列 --> df[列名]
df[列名序列]
获取一列:df[列名]
如果获取一列,我们直接写入列名即可
# 获取一列
frame["year"]
one 2000
two 2001
three 2002
four 2001
five 2002
six 2003
Name: year, dtype: int64
获取多列: df[ [多个列名] ]
如果获取多列,需要写入多个列名的列表
# 获取多列
frame[['year', 'state']]
year | state | |
---|---|---|
one | 2000 | Ohio |
two | 2001 | Ohio |
three | 2002 | Ohio |
four | 2001 | Nevada |
five | 2002 | Nevada |
six | 2003 | Nevada |
4.2 获取行 -> df.loc[]
- 使用方法类似
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 |
使用切片进行获取,此处不需要使用.loc
frame['one':'two']
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
4.3 使用.loc方法获取你想获取的所有
获取指定的行和列区域
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
4.4 切片的妙用
我们可以指定行和列切片的起点和终点,左闭右闭区间;
下面代码可以理解为,行从名称为’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 |
5 整数索引 iloc[行索引序列,列索引序列]
iloc
的使用和loc一致,只不过是将名称索引改为整数索引
整数索引就是使用行和列的下标(索引)进行获取
5.1 获取行
就像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 |
5.2 获取列
只要将行切片获取全部即可
获取一列
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 |
5.3 获取指定行和列范围
方法与loc完全一致,只是换了索引的方式
获取多行多列
frame.iloc[[2,3],[1,3]]
使用切片获取
### 获取指定行和列范围
frame.iloc[2:, 3:]
debt | |
---|---|
three | NaN |
four | NaN |
five | NaN |
six | NaN |