我有以下简单的熊猫数据框。
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
如果任何人有一个更优雅的解决方案,而不必创建不必要的数组,我将不胜感激。
答案 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