Python 获取数据帧中行与条件匹配的第一列值

Python 获取数据帧中行与条件匹配的第一列值,python,pandas,performance,dataframe,optimization,Python,Pandas,Performance,Dataframe,Optimization,假设我有一个熊猫数据框,看起来像这样: color number 0 red 3 1 blue 4 2 green 2 3 blue 2 df[df['color'] == 'blue']['number'][0] 我想从数字列中获取第一个值,其中颜色列的值为'blue',在本例中,该值将返回4 我知道这可以通过使用loc这样的方式实现: color number 0 red 3 1 blu

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

   color  number
0    red       3
1   blue       4
2  green       2
3   blue       2
df[df['color'] == 'blue']['number'][0]
我想从数字列中获取第一个值,其中颜色列的值为
'blue'
,在本例中,该值将返回
4

我知道这可以通过使用
loc
这样的方式实现:

   color  number
0    red       3
1   blue       4
2  green       2
3   blue       2
df[df['color'] == 'blue']['number'][0]

我想知道,如果我只需要第一次出现,是否还有更好的方法。

使用
idxmax

df.loc[(df['color'] == 'blue').idxmax(),'number']
Out[698]: 4

使用
idxmax

df.loc[(df['color'] == 'blue').idxmax(),'number']
Out[698]: 4

使用
head
-如果颜色存在,则返回第一行,否则返回空的
序列

col = 'blue'
df.query('color == @col').head(1).loc[:, 'number']

1    4
Name: number, dtype: int64
或者,要获取单个项目,请使用
obj.is\u empty

u = df.query('color == @col').head(1)
if not u.is_empty:
    print(u.at[u.index[0], 'number'])

# 4

无效颜色的
head
idxmax
之间的差异:

df.query('color == "blabla"').head(1).loc[:, 'number']
# Series([], Name: number, dtype: int64)

df.loc[(df['color'] == 'blabla').idxmax(),'number']
# 3

使用
head
-如果颜色存在,则返回第一行,否则返回空的
序列

col = 'blue'
df.query('color == @col').head(1).loc[:, 'number']

1    4
Name: number, dtype: int64
或者,要获取单个项目,请使用
obj.is\u empty

u = df.query('color == @col').head(1)
if not u.is_empty:
    print(u.at[u.index[0], 'number'])

# 4

无效颜色的
head
idxmax
之间的差异:

df.query('color == "blabla"').head(1).loc[:, 'number']
# Series([], Name: number, dtype: int64)

df.loc[(df['color'] == 'blabla').idxmax(),'number']
# 3
用于:

注:这也适用于颜色不存在的情况。相比之下,
df['color'].eq('orange').idxmax()
给出了
0
,即使
'orange'
在系列中不存在。上述逻辑将给出
-1

numba
我想知道,如果我只知道 需要第一次出现

对!!有关更有效的解决方案,请参阅。Numba允许您高效地按行迭代。在这种情况下,您需要首先将数字数组仅馈送给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
当然,对于一次性计算,这是低效的。但对于连续计算,该解决方案可能比检查整个系列/阵列是否相等的解决方案快一倍。

使用:

注:这也适用于颜色不存在的情况。相比之下,
df['color'].eq('orange').idxmax()
给出了
0
,即使
'orange'
在系列中不存在。上述逻辑将给出
-1

numba
我想知道,如果我只知道 需要第一次出现

对!!有关更有效的解决方案,请参阅。Numba允许您高效地按行迭代。在这种情况下,您需要首先将数字数组仅馈送给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

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

在调用idxmax之前,您需要在此处使用if语句。@coldspeed像这样吗
df.loc[if(df['color']=='blue').idxmax(),'number']
@UBears No,例如,请参见下面我的答案。或者,
if(df['color']=='blue').any():…
@coldspeed所以我需要一个if语句来检查列是否为空?@UBears否,它是检查“blue”是否存在。否则,如果蓝色不存在,
idxmax
始终返回0,此时返回的结果应为空。这有意义吗?再一次,您可以看到我的答案示例和答案的比较在调用idxmax之前,您需要一个if语句。@coldspeed像这样吗
df.loc[if(df['color']=='blue').idxmax(),'number']
@UBears No,例如,请参见下面我的答案。或者,
if(df['color']=='blue').any():…
@coldspeed所以我需要一个if语句来检查列是否为空?@UBears否,它是检查“blue”是否存在。否则,如果蓝色不存在,
idxmax
始终返回0,此时返回的结果应为空。这有意义吗?再一次,你可以看到我的答案,例如和答案的比较