Pandas通过index选择并获取行和列
作者:饺子大人 发布时间:2023-06-02 04:30:21
通过指定pandas.DataFrame和pandas.Series的index(下标),可以选择和获取行/列或元素的值。根据[]中指定的值的类型,可以获取的数据会有所不同。
将描述以下内容。
获取pandas.DataFrame的列
列名称:将单个列作为pandas.Series获得
列名称的列表:将单个或多个列作为pandas.DataFrame获得
获取pandas.DataFrame的行
行名・行号的切片:将单行或多行作为pandas.DataFrame获得
获取pandas.Series的值
标签名称:获取每种类型的单个元素的值
标签名称/编号列表:将单个或多个元素的值作为pandas.Series获得
标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
获取pandas.DataFrame元素的值
行名/列名是整数值时的注意事项
在pandas.DataFrame的情况下,如果您不习惯该规范,则会感到困惑,例如,获取列作为列表,获取行作为切片。通过使用at,iat,loc和iloc,可以更清楚地选择范围。您还可以使用pandas.DataFrame,切片列提取元素值,并按行名/行号或列表选择行。
请参阅以下文章。
Pandas获取和修改任意位置的值(at,iat,loc,iloc)
在此示例代码中,read_csv读取并使用以下csv数据。
import pandas as pd
df = pd.read_csv('./data/28/sample_pandas_normal.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
还可以使用set_index()将现有的DataFrame列指定为索引。
Pandas.DataFrame,重置列的行名(set_index)
获取pandas.DataFrame的列
列名称:将单个列作为pandas.Series获得
如果仅在[]中指定列名(列标签),则将提取所选列并将其作为pandas.Series获取。
print(df['age'])
print(type(df['age']))
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(df.age)
print(type(df.age))
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
列名称的列表:将单个或多个列作为pandas.DataFrame获得
如果指定列名列表,则将提取选定的多个列并将其检索为pandas.DataFrame。
print(df[['age', 'point']])
print(type(df[['age', 'point']]))
# age point
# name
# Alice 24 64
# Bob 42 92
# Charlie 18 70
# Dave 68 70
# Ellen 24 88
# Frank 30 57
# <class 'pandas.core.frame.DataFrame'>
即使在具有一个元素的列表的情况下,它也成为pandas.DataFrame的一列。不是pandas.Series。
print(df[['age']])
print(type(df[['age']]))
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# <class 'pandas.core.frame.DataFrame'>
如果是切片,它将是一个空的pandas.DataFrame。因为切片被视为行规范(请参见下文)。
print(df['age':'point'])
# Empty DataFrame
# Columns: [age, state, point]
# Index: []
也可以使用loc进行列切片。另外,如果使用iloc,则可以按列号而不是列名(列标签)指定。有关详细信息,请参见以下文章。
Pandas获取和修改任意位置的值(at,iat,loc,iloc
print(df.loc[:, 'age':'point'])
print(type(df.loc[:, 'age':'point']))
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
# <class 'pandas.core.frame.DataFrame'>
print(df.iloc[:, [0, 2]])
print(type(df.iloc[:, [0, 2]]))
# age point
# name
# Alice 24 64
# Bob 42 92
# Charlie 18 70
# Dave 68 70
# Ellen 24 88
# Frank 30 57
# <class 'pandas.core.frame.DataFrame'>
获取pandas.DataFrame的行
行名・行号的切片:将单行或多行作为pandas.DataFrame获得
如果在[]中指定切片,则可以提取并获取相应范围内的多行作为pandas.DataFrame。
print(df[1:4])
print(type(df[1:4]))
# age state point
# name
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# <class 'pandas.core.frame.DataFrame'>
可以指定一个负值或指定一个步骤,例如start:stop:step。您可以提取并获得奇数或偶数行。
print(df[:-3])
print(type(df[1:-3]))
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# <class 'pandas.core.frame.DataFrame'>
print(df[::2])
print(type(df[::2]))
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
print(df[1::2])
print(type(df[1::2]))
# age state point
# name
# Bob 42 CA 92
# Dave 68 TX 70
# Frank 30 NY 57
# <class 'pandas.core.frame.DataFrame'>
如果它不是切片,则它是无用的;如果直接指定行号,则会发生错误。
# print(df[1])
# KeyError: 1
即使只选择了一行,您也可以获得pandas.DataFrame。它不会成为pandas.Series。
print(df[1:2])
print(type(df[1:2]))
# age state point
# name
# Bob 42 CA 92
# <class 'pandas.core.frame.DataFrame'>
print(df['Bob':'Ellen'])
print(type(df['Bob':'Ellen']))
# age state point
# name
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
如果使用loc或iloc,则可以为一行单独指定行名和行号,并将其获取为pandas.Series,也可以在列表中选择多行。
print(df.loc['Bob'])
print(type(df.loc['Bob']))
# age 42
# state CA
# point 92
# Name: Bob, dtype: object
# <class 'pandas.core.series.Series'>
print(df.loc[['Bob', 'Ellen']])
print(type(df.loc[['Bob', 'Ellen']]))
# age state point
# name
# Bob 42 CA 92
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
print(df.iloc[[1, 4]])
print(type(df.iloc[[1, 4]]))
# age state point
# name
# Bob 42 CA 92
# Ellen 24 CA 88
# <class 'pandas.core.frame.DataFrame'>
获取pandas.Series的值
以以下pandas.Series为例。
s = df['age']
print(s)
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
# Name: age, dtype: int64
标签名称:获取每种类型的单个元素的值
如果标签名称/编号是独立指定的,则可以按原样获得该值。如果是数字,则可以从末尾开始使用负值指定位置。 -1是结尾(最后一个)。
也可以在后面指定标签名称,就像pandas.DataFrame的列名称规范一样。但是,请注意,如果列名与现有方法名或属性名重叠,则将优先使用。
print(s[3])
print(type(s[3]))
# 68
# <class 'numpy.int64'>
print(s['Dave'])
print(type(s['Dave']))
# 68
# <class 'numpy.int64'>
print(s[-1])
print(type(s[-1]))
# 30
# <class 'numpy.int64'>
print(s.Dave)
print(type(s.Dave))
# 68
# <class 'numpy.int64'>
标签名称/编号列表:将单个或多个元素的值作为pandas.Series获得
在列表的情况下,可以将多个选定的值作为pandas.Series获得。
print(s[[1, 3]])
print(type(s[[1, 3]]))
# name
# Bob 42
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s[['Bob', 'Dave']])
print(type(s[['Bob', 'Dave']]))
# name
# Bob 42
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
对于具有1个元素的列表,它是pandas.Series,具有1个元素,而不是元素本身。
print(s[[1]])
print(type(s[[1]]))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s[['Bob']])
print(type(s[['Bob']]))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
在切片的情况下,可以将多个选定值作为pandas.Series获得。如果是标签名称的一部分,则还会选择停止线。
print(s[1:3])
print(type(s[1:3]))
# name
# Bob 42
# Charlie 18
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s['Bob':'Dave'])
print(type(s['Bob':'Dave']))
# name
# Bob 42
# Charlie 18
# Dave 68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
当选择一个元件,它变得与pandas.Series一种元素。
print(s[1:2])
print(type(s[1:2]))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
print(s['Bob':'Bob'])
print(type(s['Bob':'Bob']))
# name
# Bob 42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>
获取pandas.DataFrame元素的值
通过从pandas.DataFrame中提取pandas.Series,然后从该pandas.Series中选择并获取值,可以从pandas.DataFrame中获取元素值。
print(df['age']['Alice'])
# 24
还可以组合切片和列表以提取任何范围。
print(df['Bob':'Dave'][['age', 'point']])
# age point
# name
# Bob 42 92
# Charlie 18 70
# Dave 68 70
但是,这种重复索引引用([…])的方法称为链式索引,因此不建议使用,因为在为选择分配值时可能发生SettingWithCopyWarning。 …
可以使用at,iat,loc和iloc一次指定行和列。这是优选的。
print(df.at['Alice', 'age'])
# 24
print(df.loc['Bob':'Dave', ['age', 'point']])
# age point
# name
# Bob 42 92
# Charlie 18 70
# Dave 68 70
行名/列名是整数值时的注意事项
在到目前为止的示例中,行名/列名是字符串,但是当行名/列名是整数值时要小心。
以下面的pandas.DataFrame为例。
df = pd.DataFrame([[0, 10, 20], [30, 40, 50], [60, 70, 80]],
index=[2, 0, 1], columns=[1, 2, 0])
print(df)
# 1 2 0
# 2 0 10 20
# 0 30 40 50
# 1 60 70 80
在[标量值]和[列表]的情况下,指定的值被视为列名。
print(df[0])
# 2 20
# 0 50
# 1 80
# Name: 0, dtype: int64
print(df[[0, 2]])
# 0 2
# 2 20 10
# 0 50 40
# 1 80 70
对于“切片”,将指定的值视为行号,而不是行名。负值也可以使用。 打印(df [:2])
print(df[:2])
# 1 2 0
# 2 0 10 20
# 0 30 40 50
print(df[-2:])
# 1 2 0
# 0 30 40 50
# 1 60 70 80
使用loc(行名)iloc(行号)来明确指定它是行名还是行号。
print(df.loc[:2])
# 1 2 0
# 2 0 10 20
print(df.iloc[:2])
# 1 2 0
# 2 0 10 20
# 0 30 40 50
s = df[2]
print(s)
# 2 10
# 0 40
# 1 70
# Name: 2, dtype: int64
pandas.Series认为指定的值是标签名称而不是数字。
print(s[0])
# 40
使用at和iat可以清楚地指定标签名称或编号。 loc和iloc很好,但是at和iat更快。
print(s.at[0])
# 40
print(s.iat[0])
# 10
特别要注意的是,如果尝试获取最后一个值并尝试获取[-1],它将被视为对名为-1的标签的值的选择。确定,如果您使用iat。
# print(s[-1])
# KeyError: -1
print(s.iat[-1])
# 70
这样,当行名和列名是整数值时,最好使用at,iat,loc和iloc以避免混淆。
来源:https://blog.csdn.net/qq_18351157/article/details/109652320


猜你喜欢
- 这篇文章主要介绍了通过实例简单了解Python中yield的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 前言许多 Go 初学者在方法 * 的选择上可能会感到困惑,不知道该选择值 * 还是指针 * 。本文将会对方法 * 进行介
- 随机显示图片代码:<div class="sidebarcen"><script language=&
- 在我们的生活中,需要接触大量的带有机械按键的物品。当你用手指按下按键的时候。都会或强或弱的感受一股(嗯,也有可能是一丝丝)反作用力传递到你手
- 1、利用php gd库的函数绘制3D扇形统计图<?phpheader("content-type","t
- 众所周知:python json 可以转换的json字符串,但是在将其转换为字典时,出现了乱序字典是一个散列结构,亦即他自身根据key进行排
- 感觉很流畅的键盘控制(带惯性) <body> <div id="man" style="po
- Merge函数的用法简单来说Merge函数相当于Excel中的vlookup函数。当我们对2个表进行数据合并的时候需要通过指定两个表中相同的
- 数据库事务-锁机制1.什么是锁锁,其实就是一个内存种的结构,在事务还没有来之前是没有锁存在的。在事务未开始前只有一条记录,是没有锁和记录之间
- 上一篇相关文章python_tkinter弹出对话框创建需要的可以参考一下1.fledialog对话框示例:askopenfilename(
- torch.Tensor有4种常见的乘法:*, torch.mul, torch.mm, torch.matmul. 本文抛砖引玉,简单叙述
- 图像梯度图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小
- 目录1.按照一列数值进行排序1.1按照五缺失值的一列进行排序1.1.1升序排列1.1.2 降序排列1.2按照有缺失值的一列进行排序1.2.1
- 你是否发现,在浩如烟海的应用程序堆里,具有漂亮图标和清爽名字的 App 更容易被用户喜爱。作为开发者,面对这自己的作品,能否自问一句:“从图
- var yData = [];//Y轴数据 var xData = [];//X轴数据 $(data.rows).each(function
- 现在的域名提供已经取消免费的url转发功能,而且我们一般主要用的是带www的域名,以前不带www的域名一般是做url转发跳转到带www的域名
- 引言前几天忽然想到了四则运算和二树有没有关系,然后在网络上检索了一下,发现还真的有四则运算和二叉树。因为总是见到把 四则运算表达式 用 树
- 1、配置pycharm 依次点击"File"-->"Settings",进入"Edi
- 在二维卷积函数tf.nn.conv2d(),最大池化函数tf.nn.max_pool(),平均池化函数tf.nn.avg_pool()中,卷
- pytorch查看模型model参数parameters示例1:pytorch自带的faster r-cnn模型import torchim