如何从 Pandas DataFrame 中获取值而不是索引和对象类型

Posted

技术标签:

【中文标题】如何从 Pandas DataFrame 中获取值而不是索引和对象类型【英文标题】:How to get a value from a Pandas DataFrame and not the index and object type 【发布时间】:2015-08-27 13:38:23 【问题描述】:

假设我有以下 DataFrame

字母编号 1 乙二 C 3 4

可以通过以下代码获取

import pandas as pd

letters=pd.Series(('A', 'B', 'C', 'D'))
numbers=pd.Series((1, 2, 3, 4))
keys=('Letters', 'Numbers')
df=pd.concat((letters, numbers), axis=1, keys=keys)

现在我想从 Letters 列中获取值 C。

命令行

df[df.Letters=='C'].Letters

会回来

2℃ 名称:字母,数据类型:对象

我怎样才能只得到值 C 而不是整个两行输出?

【问题讨论】:

在不相关的说明中,有一个更好的方法来构建您的 DataFrame:pd.DataFrame('Letters': letters, 'Numbers': numbers) 【参考方案1】:
df[df.Letters=='C'].Letters.item()

这将返回从该选择返回的索引/系列中的第一个元素。在这种情况下,该值始终是第一个元素。

编辑:

或者您可以运行 loc() 并以这种方式访问​​第一个元素。这更短,是我过去实现它的方式。

Pandas Index doc Pandas Series doc

【讨论】:

我喜欢这种方法,但是我收到了警告:FutureWarning: "item" has been deprecated and will be removed in a future version @AlexG:你可以改用这个:df[df.Letters=='C'].Letters.iloc[0]。它产生结果系列中的第一个元素(也是唯一的)。 使用 loc[:1] 仍然在值旁边显示索引:( @AlexG 和@Sonic Soul:尝试改用df[df.Letters=='C'].Letters.squeeze()。这以同样的方式工作。 :)【参考方案2】:

使用values属性将值作为np数组返回,然后使用[0]获取第一个值:

In [4]:
df.loc[df.Letters=='C','Letters'].values[0]

Out[4]:
'C'

编辑

我个人更喜欢使用下标运算符访问列:

df.loc[df['Letters'] == 'C', 'Letters'].values[0]

这避免了列名可以包含空格或破折号- 的问题,这意味着使用. 进行访问。

【讨论】:

这确实无关紧要,但在您的选择中,您使用点符号访问“字母”列; df.loc[df.Letters=='C']。如果您的列名中有空格,您可能应该使用转换器将其删除,就像从 CSV 或 Excel 文件导入一样。 @thomas-ato 我会更新我的答案,但我不同意将列修改为附加步骤,除非这是必要的,在这种情况下,我同意没有区别 @EdChum.. 在这种情况下:我们如何处理错误:“IndexError: index 0 is out of bounds for axis 0 with size 0”【参考方案3】:
import pandas as pd

dataset = pd.read_csv("data.csv")
values = list(x for x in dataset["column name"])

>>> values[0]
'item_0'

编辑:

实际上,您可以像任何旧数组一样索引数据集。

import pandas as pd

dataset = pd.read_csv("data.csv")
first_value = dataset["column name"][0]

>>> print(first_value)
'item_0'

【讨论】:

【参考方案4】:

您可以将loc 与索引和列标签一起使用。

df.loc[2, 'Letters']
# 'C'

如果您更喜欢“数字”列作为参考,可以将其设置为索引。

df.set_index('Numbers').loc[3, 'Letters']

我发现这个清洁器不需要[0].item()

【讨论】:

这并没有解决特定问题。如果索引未知,您的代码将无济于事。 第二个版本(将一列设置为索引)确实适用于这种情况。 :)

以上是关于如何从 Pandas DataFrame 中获取值而不是索引和对象类型的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以扩展包含列表的 pandas Dataframe 中的列并从列表值本身中获取列名?

Pandas:如何从给定(行,列)对列表的 DataFrame 中检索值?

如何在 Pandas DataFrame 中一次获取多列的值计数?

如何从 print() 编写的字符串中获取 Python pandas DataFrame?

如何获取Pandas DataFrame中的最大值/最小值

pandas获取dataframe中索引值最小值所在的数据行(get dataframe row of min index value)