如何在不知道其索引的情况下查询熊猫数据框的特定值

时间:2018-07-18 13:30:44

标签: python python-3.x pandas dataframe indexing

我有以下简单的熊猫数据框。

import pandas as pd
import numpy as np

data = [['5A', 10], ['5B', 20], ['5C', 30], ['5D', 40]]
df = pd.DataFrame(data, columns=['Name', 'Values'])
print(df)

产生

  Name Values
0 5A   10
1 5B   20
2 5C   30
3 5D   40

我想在Values的位置选择Name=5B的值,该值应为20。首先,我实现了以下命令;

mask = df['Name'] == '5B'
test = df.loc[mask].Values
print(test)

产生了以下结果

  Values
1 20

但是,这是一个数据框,而不是一个值,我只想要该值!我可以执行以下操作将其转换为值,但是它需要先验知识的索引。

test = df.loc[mask].Values[1]

如前所述,用户永远不会知道该值的索引,他们只知道应该查询的值。知道将只选择一个值后,我可以将其转换为如图所示的数组,从中我知道该值将始终位于数组的索引0处;但是,必须有一个更优雅的解决方案。

test = np.array(df.loc[mask].Values)[0]
print(test)

20

如果任何人有一个更优雅的解决方案,而不必创建不必要的数组,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

您可以按Name进行索引,然后使用pd.DataFrame.at进行快速标量访问:

df = df.set_index('Name')
res = df.at['5B', 'Values']
# also possible: df.loc['5B', 'Values']

如果行索引器是一个序列,pd.DataFrame.loc将返回一个序列(如果列过滤器是一个标量)或一个数据框(如果列过滤器是一个列表)。

作为将loc与行/列标签一起使用的快速指南,假设标签是唯一的:

RowIndex    ColIndex    Result
---------------------------------
Array       Scalar      Series
Scalar      Array       Series
Array       Array       DataFrame
Scalar      Scalar      Scalar

由于df['Name'] == '5B'类似于数组,因此您的尝试属于第一类。

当然,您可以通过df.loc[mask, 'Values'].iloc[0]df.loc[mask, 'Values'].values[0]提取第一个值。但是,如果您知道Name是唯一标识符,则将其转换为索引会更有成效。

答案 1 :(得分:1)

您只需使用.index和.loc即可获取值。代码如下:

ask = df.index[df['Name']==5b][0]
test = df.loc[mask,'Values']
print(test)

答案 2 :(得分:0)

df.loc[mask].Values.values为您提供了一组值; df.loc[mask].Values.values[0](或任何索引)将只为您提供值。

答案 3 :(得分:0)

您可以通过loc这样操作:

import pandas as pd
import numpy as np

data = [['5A', 10], ['5B', 20], ['5C', 30], ['5D', 40]]
df = pd.DataFrame(data, columns=['Name', 'Values'])

value = df.loc[df['Name'] == '5B','Values'].values[0]
print(value)
> 20