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

180

假设我有如下DataFrame

字母    数字
A          1
B          2
C          3
D          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

将只返回C值而不是整个两行输出的方法是什么?

2    C
Name: Letters, dtype: object

12
没关系,构建DataFrame有更好的方法:pd.DataFrame({'Letters': 字母, 'Numbers': 数字}) - JoeCondron
5个回答

246
df[df.Letters=='C'].Letters.item()

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

编辑:

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


7
我喜欢这个方法,但是我收到了一个警告:“FutureWarning: "item"已被弃用,将在未来的版本中移除”。 - Alex
6
@AlexG:你可以使用这个代替:df[df.Letters=='C'].Letters.iloc[0]。它会生成结果系列中的第一个元素(也是唯一的元素)。 - Anh-Thi DINH
使用loc[:1]仍然显示值旁边的索引 :( - Sonic Soul
4
@AlexG 和 @Sonic Soul:尝试使用 df[df.Letters=='C'].Letters.squeeze() 替代。这样可以实现相同的功能。 :) - user78910

93

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

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

Out[4]:
'C'

编辑

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

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

这样可以避免列名中含有空格或破折号 - 导致使用 . 访问时出现问题。


3
虽然这并不重要,但在你的选择中,你使用点符号访问“Letters”列; df.loc[df.Letters=='C']。 如果你的列名中有空格,你应该使用转换器去掉它们,就像从CSV或Excel文件导入时一样。 - prototypik
@thomas-ato 我会更新我的答案,但我不同意将列修改为额外步骤,除非必要,在这种情况下,我同意它没有任何区别。 - EdChum
@EdChum.. 在这种情况下,我们该如何处理错误:"IndexError: index 0 is out of bounds for axis 0 with size 0"? - Arya

4
你可以使用 loc 和索引标签以及列标签进行操作。
df.loc[2, 'Letters']
# 'C'

如果你更倾向于使用“Numbers”列作为参考,你可以将其设置为索引。
df.set_index('Numbers').loc[3, 'Letters']

我认为这种方法更为简洁,因为它不需要使用[0].item()


这并没有解决特定的问题。如果索引未知,你的代码是无法帮助的。 - TLK3
第二个版本(将一列设置为索引)在这种情况下确实适用。 :) - nocibambi

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'

1

我认为一个好的选择是先将您的单行DataFrame转换为Series,然后对其进行索引:

df[df.Letters=='C'].squeeze()['Letters']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接