我有一个关于提取单个列值的简单熊猫问题
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.我如何得到它?
答案 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