从pandas中的列中提取单个值

时间:2014-02-21 01:41:12

标签: 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.我如何得到它?

2 个答案:

答案 0 :(得分:9)

我首选的方式是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

我不知道为什么这么慢,也许这个用例可以改进......? (我不确定额外的100us花在哪里)......

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

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

答案 1 :(得分:5)

简单地说: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