说我有一个熊猫数据框,看起来像这样:
color number
0 red 3
1 blue 4
2 green 2
3 blue 2
我想从number列中获取第一个值,其中color列的值为'blue'
,在这种情况下将返回4
。
我知道可以使用loc
这样来完成此操作:
df[df['color'] == 'blue']['number'][0]
我想知道是否有更多的最佳方法,因为我只需要第一次出现。
答案 0 :(得分:2)
使用idxmax
df.loc[(df['color'] == 'blue').idxmax(),'number']
Out[698]: 4
答案 1 :(得分:2)
使用--w timeout
-如果存在颜色,它将返回第一行,否则返回空白head
。
Series
或者,要获取单个项目,请使用col = 'blue'
df.query('color == @col').head(1).loc[:, 'number']
1 4
Name: number, dtype: int64
:
obj.is_empty
u = df.query('color == @col').head(1)
if not u.is_empty:
print(u.at[u.index[0], 'number'])
# 4
和head
之间的无效颜色差异:
idxmax
答案 2 :(得分:1)
idx = next(iter(df['number'].iloc[np.where(df['color'].eq('blue'))]), -1) # 4
请注意,这也可以处理不存在颜色的情况。相比之下,即使df['color'].eq('orange').idxmax()
在系列中不存在,0
也会给出'orange'
。上面的逻辑将给出-1
。
numba
我想知道是否有更多的最佳方法,因为我只是 永远都需要第一次出现。
是的!有关更有效的解决方案,请参见Efficiently return the index of the first value satisfying condition in array。 Numba允许您有效地逐行迭代。在这种情况下,您将需要先factorize your strings,以便仅将数字数组提供给Numba:
from numba import njit
# factorize series, pd.factorize maintains order,
# i.e. first item in values gives 0 index
idx, values = pd.factorize(df['color'])
idx_search = np.where(values == 'blue')[0][0]
@njit
def get_first_index_nb(A, k):
for i in range(len(A)):
if A[i] == k:
return i
return -1
res = df['number'].iat[get_first_index_nb(idx, 1)] # 4
当然,对于一次性计算,这是无效的。但是对于连续计算,该解决方案可能比检查整个序列/数组是否相等的解决方案快一个因数。