在行匹配条件的Pandas DataFrame中获取第一列值

时间:2019-01-18 17:18:14

标签: python pandas performance dataframe optimization

说我有一个熊猫数据框,看起来像这样:

   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]

我想知道是否有更多的最佳方法,因为我只需要第一次出现。

3 个答案:

答案 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)

ilocnp.where结合使用:

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

当然,对于一次性计算,这是无效的。但是对于连续计算,该解决方案可能比检查整个序列/数组是否相等的解决方案快一个因数。