【问题标题】:How to get a value from a Pandas DataFrame and not the index and object type如何从 Pandas DataFrame 中获取值而不是索引和对象类型
【发布时间】: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})

标签: python pandas dataframe


【解决方案1】:
df[df.Letters=='C'].Letters.item()

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

编辑:

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

【讨论】:

  • 我喜欢这种方法,但是我收到了警告: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()

    【讨论】:

    • 这并没有解决特定问题。如果索引未知,您的代码将无济于事。
    • 第二个版本(将一列设置为索引)确实适用于这种情况。 :)
    猜你喜欢
    • 2018-10-07
    • 2020-06-17
    • 2017-10-06
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2018-06-09
    • 2022-10-01
    • 2021-11-12
    相关资源
    最近更新 更多