Python 从表中的列中提取单个值

Python 从表中的列中提取单个值,python,pandas,Python,Pandas,我有一个关于提取单个列值的简单问题 df = DataFrame({'A' : [15,56,23,84], 'B' : [10,20,33,25]}) df A B 0 15 10 1 56 20 2 23 33 3 84 55 x = df[df['A'] == 23] x 输出 A B 2 23 33 但是,我只想得到B列中的值,即33。我如何得到它?简单地说:df['B'][df['A']==23] 谢

我有一个关于提取单个列值的简单问题

df = DataFrame({'A' : [15,56,23,84], 'B' : [10,20,33,25]})
df

     A    B
0    15   10
1    56   20
2    23   33
3    84   55

x = df[df['A'] == 23]
x
输出

    A    B
2  23    33

但是,我只想得到B列中的值,即33。我如何得到它?

简单地说:
df['B'][df['A']==23]

谢谢@Jeff

速度比较:

In [30]:

%timeit df['B'][df['A'] == 23].values
1000 loops, best of 3: 813 µs per loop
In [31]:

%timeit df.loc[df['A'] == 23, 'B']
1000 loops, best of 3: 976 µs per loop

我更喜欢的方法是Jeff使用loc(通常避免复制副本是一种很好的做法,特别是如果您以后可能会做作业的话)

通过不为布尔掩码创建系列,只创建一个numpy数组,您可以获得更高的性能:

df = pd.DataFrame(np.random.randint(1, 100, 2000).reshape(-1, 2),
                  columns=list('AB'))

In [21]: %timeit df.loc[df.A == 23, 'B']
1000 loops, best of 3: 532 µs per loop

In [22]: %timeit df['B'][df.A == 23]
1000 loops, best of 3: 432 µs per loop

In [23]: %timeit df.loc[df.A.values == 23, 'B']  # preferred
1000 loops, best of 3: 294 µs per loop

In [24]: %timeit df['B'].loc[df.A.values == 23]
1000 loops, best of 3: 197 µs per loop
我不确定这为什么这么慢,也许这个用例可以改进。。。?(我不知道额外的100美元花在哪里了)

但是,如果您只对B的值感兴趣,而不是对其对应的索引(和子帧)感兴趣,那么直接使用numpy数组会快得多:

In [25]: %timeit df.B.values[df.A.values == 23]
10000 loops, best of 3: 60.3 µs per loop

谢谢,现在我得到:233。有没有办法只获取我需要的值,即33?
df['B'][df['a']==23]。值
如果你不介意一个
numpy
标量
,它必须是普通的
浮点
?我认为这样更好,如果你有多个值,返回的将是a
numpy
array
。不要使用链式索引,而是:
df.loc[df['a']==23,'B']
;也就是说,您可以设置一个简单的浮点值(如果您尝试查看,上面会显示一个警告),但这似乎也很有效。我只做df['B'][df['A']==23]。值[0]或杰夫的方法:df.loc[df['A']==23,'B']。值[0]@Jeff,你的方法快吗?数据帧越大,差异就越小。。。100us似乎是相当恒定的。非常感谢您的详细分析,在您的上一个示例中,df.B.values[df.A.values==23],是否有任何方法可以将“B”替换为变量?我的列名是在运行时计算的。在其他方法中,我可以使用变量名,但在您的上一个示例中(由于其速度原因,我想使用它)。@user308827是的,您肯定可以使用df['B']表示法,因此如果
A='A'
B='B'
您可以执行:
df[B].values[df[A].values==23]