目录
- 获取pandas.DataFrame的列
- 列名称:将单个列作为pandas.Series获得
- 列名称的列表:将单个或多个列作为pandas.DataFrame获得
- 获取pandas.DataFrame的行
- 行名・行号的切片:将单行或多行作为pandas.DataFrame获得
- 获取pandas.Series的值
- 标签名称:获取每种类型的单个元素的值
- 标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
- 获取pandas.DataFrame元素的值
- 行名/列名是整数值时的注意事项
通过指定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//sample_pandas_normal.csv', index_col=0) | |
print(df) | |
# age state point | |
# name | |
# Alice NY 64 | |
# Bob CA 92 | |
# Charlie CA 70 | |
# Dave TX 70 | |
# Ellen CA 88 | |
# Frank NY 57 |
还可以使用set_index()将现有的DataFrame列指定为索引。
Pandas.DataFrame,重置列的行名(set_index)
获取pandas.DataFrame的列
列名称:将单个列作为pandas.Series获得
如果仅在[]中指定列名(列标签),则将提取所选列并将其作为pandas.Series获取。
print(df['age']) | |
print(type(df['age'])) | |
# name | |
# Alice | |
# Bob | |
# Charlie | |
# Dave | |
# Ellen | |
# Frank | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> | |
print(df.age) | |
print(type(df.age)) | |
# name | |
# Alice | |
# Bob | |
# Charlie | |
# Dave | |
# Ellen | |
# Frank | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> |
列名称的列表:将单个或多个列作为pandas.DataFrame获得
如果指定列名列表,则将提取选定的多个列并将其检索为pandas.DataFrame。
print(df[['age', 'point']]) | |
print(type(df[['age', 'point']])) | |
# age point | |
# name | |
# Alice 64 | |
# Bob 92 | |
# Charlie 70 | |
# Dave 70 | |
# Ellen 88 | |
# Frank 57 | |
# <class 'pandas.core.frame.DataFrame'> |
即使在具有一个元素的列表的情况下,它也成为pandas.DataFrame的一列。不是pandas.Series。
print(df[['age']]) | |
print(type(df[['age']])) | |
# age | |
# name | |
# Alice | |
# Bob | |
# Charlie | |
# Dave | |
# Ellen | |
# Frank | |
# <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 NY 64 | |
# Bob CA 92 | |
# Charlie CA 70 | |
# Dave TX 70 | |
# Ellen CA 88 | |
# Frank NY 57 | |
# <class 'pandas.core.frame.DataFrame'> | |
print(df.iloc[:, [, 2]]) | |
print(type(df.iloc[:, [, 2]])) | |
# age point | |
# name | |
# Alice 64 | |
# Bob 92 | |
# Charlie 70 | |
# Dave 70 | |
# Ellen 88 | |
# Frank 57 | |
# <class 'pandas.core.frame.DataFrame'> |
获取pandas.DataFrame的行
行名・行号的切片:将单行或多行作为pandas.DataFrame获得
如果在[]中指定切片,则可以提取并获取相应范围内的多行作为pandas.DataFrame。
print(df[:4]) | |
print(type(df[:4])) | |
# age state point | |
# name | |
# Bob CA 92 | |
# Charlie CA 70 | |
# Dave TX 70 | |
# <class 'pandas.core.frame.DataFrame'> |
可以指定一个负值或指定一个步骤,例如start:stop:step。您可以提取并获得奇数或偶数行。
print(df[:-]) | |
print(type(df[:-3])) | |
# age state point | |
# name | |
# Alice NY 64 | |
# Bob CA 92 | |
# Charlie CA 70 | |
# <class 'pandas.core.frame.DataFrame'> | |
print(df[::]) | |
print(type(df[::])) | |
# age state point | |
# name | |
# Alice NY 64 | |
# Charlie CA 70 | |
# Ellen CA 88 | |
# <class 'pandas.core.frame.DataFrame'> | |
print(df[::2]) | |
print(type(df[::2])) | |
# age state point | |
# name | |
# Bob CA 92 | |
# Dave TX 70 | |
# Frank NY 57 | |
# <class 'pandas.core.frame.DataFrame'> |
如果它不是切片,则它是无用的;如果直接指定行号,则会发生错误。
print(df[]) | |
KeyError: |
即使只选择了一行,您也可以获得pandas.DataFrame。它不会成为pandas.Series。
print(df[:2]) | |
print(type(df[:2])) | |
# age state point | |
# name | |
# Bob CA 92 | |
# <class 'pandas.core.frame.DataFrame'> | |
print(df['Bob':'Ellen']) | |
print(type(df['Bob':'Ellen'])) | |
# age state point | |
# name | |
# Bob CA 92 | |
# Charlie CA 70 | |
# Dave TX 70 | |
# Ellen CA 88 | |
# <class 'pandas.core.frame.DataFrame'> |
如果使用loc或iloc,则可以为一行单独指定行名和行号,并将其获取为pandas.Series,也可以在列表中选择多行。
print(df.loc['Bob']) | |
print(type(df.loc['Bob'])) | |
# age | |
# state CA | |
# point | |
# 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 CA 92 | |
# Ellen CA 88 | |
# <class 'pandas.core.frame.DataFrame'> | |
print(df.iloc[[, 4]]) | |
print(type(df.iloc[[, 4]])) | |
# age state point | |
# name | |
# Bob CA 92 | |
# Ellen CA 88 | |
# <class 'pandas.core.frame.DataFrame'> |
获取pandas.Series的值
以以下pandas.Series为例。
s = df['age'] | |
print(s) | |
# name | |
# Alice | |
# Bob | |
# Charlie | |
# Dave | |
# Ellen | |
# Frank | |
# Name: age, dtype: int |
标签名称:获取每种类型的单个元素的值
如果标签名称/编号是独立指定的,则可以按原样获得该值。如果是数字,则可以从末尾开始使用负值指定位置。 -1是结尾(最后一个)。
也可以在后面指定标签名称,就像pandas.DataFrame的列名称规范一样。但是,请注意,如果列名与现有方法名或属性名重叠,则将优先使用。
print(s[]) | |
print(type(s[])) | |
# | |
# <class 'numpy.int'> | |
print(s['Dave']) | |
print(type(s['Dave'])) | |
# | |
# <class 'numpy.int'> | |
print(s[-]) | |
print(type(s[-])) | |
# | |
# <class 'numpy.int'> | |
print(s.Dave) | |
print(type(s.Dave)) | |
# | |
# <class 'numpy.int'> |
标签名称/编号列表:将单个或多个元素的值作为pandas.Series获得
在列表的情况下,可以将多个选定的值作为pandas.Series获得。
print(s[[, 3]]) | |
print(type(s[[, 3]])) | |
# name | |
# Bob | |
# Dave | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> | |
print(s[['Bob', 'Dave']]) | |
print(type(s[['Bob', 'Dave']])) | |
# name | |
# Bob | |
# Dave | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> |
对于具有1个元素的列表,它是pandas.Series,具有1个元素,而不是元素本身。
print(s[[]]) | |
print(type(s[[]])) | |
# name | |
# Bob | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> | |
print(s[['Bob']]) | |
print(type(s[['Bob']])) | |
# name | |
# Bob | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> |
标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
在切片的情况下,可以将多个选定值作为pandas.Series获得。如果是标签名称的一部分,则还会选择停止线。
print(s[:3]) | |
print(type(s[:3])) | |
# name | |
# Bob | |
# Charlie | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> | |
print(s['Bob':'Dave']) | |
print(type(s['Bob':'Dave'])) | |
# name | |
# Bob | |
# Charlie | |
# Dave | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> |
当选择一个元件,它变得与pandas.Series一种元素。
print(s[:2]) | |
print(type(s[:2])) | |
# name | |
# Bob | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> | |
print(s['Bob':'Bob']) | |
print(type(s['Bob':'Bob'])) | |
# name | |
# Bob | |
# Name: age, dtype: int | |
# <class 'pandas.core.series.Series'> |
获取pandas.DataFrame元素的值
通过从pandas.DataFrame中提取pandas.Series,然后从该pandas.Series中选择并获取值,可以从pandas.DataFrame中获取元素值。
print(df['age']['Alice']) | |
# |
还可以组合切片和列表以提取任何范围。
print(df['Bob':'Dave'][['age', 'point']]) | |
# age point | |
# name | |
# Bob 92 | |
# Charlie 70 | |
# Dave 70 |
但是,这种重复索引引用([…])的方法称为链式索引,因此不建议使用,因为在为选择分配值时可能发生SettingWithCopyWarning。 …
可以使用at,iat,loc和iloc一次指定行和列。这是优选的。
print(df.at['Alice', 'age']) | |
# | |
print(df.loc['Bob':'Dave', ['age', 'point']]) | |
# age point | |
# name | |
# Bob 92 | |
# Charlie 70 | |
# Dave 70 |
行名/列名是整数值时的注意事项
在到目前为止的示例中,行名/列名是字符串,但是当行名/列名是整数值时要小心。
以下面的pandas.DataFrame为例。
df = pd.DataFrame([[, 10, 20], [30, 40, 50], [60, 70, 80]], | |
index=[, 0, 1], columns=[1, 2, 0]) | |
print(df) | |
# 2 0 | |
# 0 10 20 | |
# 30 40 50 | |
# 60 70 80 |
在[标量值]和[列表]的情况下,指定的值被视为列名。
print(df[]) | |
# 20 | |
# 50 | |
# 80 | |
# Name:, dtype: int64 | |
print(df[[, 2]]) | |
# 2 | |
# 20 10 | |
# 50 40 | |
# 80 70 |
对于“切片”,将指定的值视为行号,而不是行名。负值也可以使用。 打印(df [:2])
print(df[:]) | |
# 2 0 | |
# 0 10 20 | |
# 30 40 50 | |
print(df[-:]) | |
# 2 0 | |
# 30 40 50 | |
# 60 70 80 |
使用loc(行名)iloc(行号)来明确指定它是行名还是行号。
print(df.loc[:]) | |
# 2 0 | |
# 0 10 20 | |
print(df.iloc[:]) | |
# 2 0 | |
# 0 10 20 | |
# 30 40 50 | |
s = df[] | |
print(s) | |
# 10 | |
# 40 | |
# 70 | |
# Name:, dtype: int64 |
pandas.Series认为指定的值是标签名称而不是数字。
print(s[]) | |
# |
使用at和iat可以清楚地指定标签名称或编号。 loc和iloc很好,但是at和iat更快。
print(s.at[]) | |
# | |
print(s.iat[]) | |
# |
特别要注意的是,如果尝试获取最后一个值并尝试获取[-1],它将被视为对名为-1的标签的值的选择。确定,如果您使用iat。
# print(s[-]) | |
# KeyError: - | |
print(s.iat[-]) | |
# |
这样,当行名和列名是整数值时,最好使用at,iat,loc和iloc以避免混淆。