如何从 Pandas DataFrame 中提取数值,而不是 Series(不涉及索引)?

7
我将尝试通过条件筛选从 Pandas DataFrame 中返回特定项目(并且不想必须引用索引)。
以下是一个示例:
我有以下数据框:
  Code  Colour  Fruit
0   1   red     apple
1   2   orange  orange
2   3   yellow  banana
3   4   green   pear
4   5   blue    blueberry

我输入以下代码来搜索蓝莓的代码:
df[df['Fruit'] == 'blueberry']['Code']

这段代码的作用是:返回以下内容:
4    5
Name: Code, dtype: int64

它的类型是:

pandas.core.series.Series

但实际上我想返回的是类型为5的数字:

numpy.int64

如果我输入以下代码,我就可以完成这个任务:

df[df['Fruit'] == 'blueberry']['Code'][4]

例如,引用索引来给出数字5,但我不想引用索引!

有没有其他语法可以在这里使用,以实现相同的效果?

谢谢!...

更新:

另一个想法是这段代码:

df[df['Fruit'] == 'blueberry']['Code'][df[df['Fruit']=='blueberry'].index[0]]

然而,这种方法似乎不是特别优雅(并且它引用了索引)。是否有更简洁且准确的方法,不需要引用索引,或者这是严格必要的吗?
谢谢!...
4个回答

6

让我们来试试这个:

df.loc[df['Fruit'] == 'blueberry','Code'].values[0]

输出:

5

首先,使用.loc利用布尔索引选择行和索引标签选择列中的值。然后将返回的Series转换为值数组,由于该数组中只有一个值,因此您可以使用索引 '[0]' 从单元素数组中获取标量值。


3

除非您使用next()^,否则引用索引是必需的,因为pd.Series不能保证只有一个值。

您可以使用pd.Series.values将值提取为数组。如果您有多个匹配项,这也适用:

res = df.loc[df['Fruit'] == 'blueberry', 'Code'].values

# array([5], dtype=int64)

df2 = pd.concat([df]*5)
res = df2.loc[df2['Fruit'] == 'blueberry', 'Code'].values

# array([5, 5, 5, 5, 5], dtype=int64)

要从numpy数组中获取列表,您可以使用.tolist()方法:
res = df.loc[df['Fruit'] == 'blueberry', 'Code'].values.tolist()

数组和列表版本都可以直观地进行索引,例如使用 res[0] 访问第一个元素。

^ 如果您真的不想使用索引,可以使用 next() 进行迭代:

next(iter(res))

似乎有必要在某个时候引用某种形式的索引来返回实际值,而不是数组或系列。 - agftrading
不,如果您使用next(iter(res)),则不需要。这将在不明确指定索引的情况下进行迭代,尽管索引可能在后台使用。 - jpp
谢谢澄清。 - agftrading

0
最简单的解决方案:将 pandas.core.series.Series 转换为整数!
my_code = int(df[df['Fruit'] == 'blueberry']['Code'])
print(my_code)

输出:

5  

0

你也可以将“Fruit”列设置为索引

df_fruit_index = df.set_index('Fruit')

根据您选择的水果,从“Code”列中提取值

df_fruit_index.loc['blueberry','Code']

问题明确指出“(不使用索引引用)”,因此这个解决方案没有回答所提出的问题,因为它将列设置为索引,然后引用了该索引。 - Trenton McKinney

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