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,此时返回的结果应为空。这有意义吗?再一次,你可以看到我的答案,例如和答案的比较