首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据条件找到一行并返回该行的列值?

如何根据条件找到一行并返回该行的列值?
EN

Stack Overflow用户
提问于 2022-03-04 12:34:09
回答 2查看 724关注 0票数 2

我有以下熊猫资料df

代码语言:javascript
复制
timestamp          col1
2021-01-11 11:00   0
2021-01-11 12:00   0
2021-01-11 13:00   1
2021-01-11 14:00   1
2021-01-11 15:00   0

我需要得到第一行的timestamp,当col1等于1时,预期的答案是2021-01-11 13:00

这是我目前的解决方案:

代码语言:javascript
复制
first = None
for index,row in df.iterrows():
    if row["col1"] == 1:
        if not first:
            first = row["timestamp"]
            break

我如何简化它,使它更快?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-04 12:35:30

如果至少匹配一个值,则解决方案:

如果只有01值,则使用Series.idxmax

代码语言:javascript
复制
out = df.loc[df['col1'].idxmax(),'timestamp']

或者,如果可能的话,另一个像0, 1这样的值通过1进行比较

代码语言:javascript
复制
out = df.loc[df['col1'].eq(1).idxmax(),'timestamp']

或者首先创建DatetimeIndex

代码语言:javascript
复制
out = df.set_index('timestamp')['col1'].idxmax()

代码语言:javascript
复制
print (out)
2021-01-11 13:00:00

任何值的解决方案-如果没有匹配的idxmax返回第一个值,那么可能的解决方案:

代码语言:javascript
复制
print (df)
            timestamp  col1
0 2021-01-11 11:00:00     0
1 2021-01-11 12:00:00     0
2 2021-01-11 13:00:00     0
3 2021-01-11 14:00:00     0
4 2021-01-11 15:00:00     0


out = df.set_index('timestamp')['col1'].eq(1).idxmax()
print (out)
2021-01-11 11:00:00

s = df.set_index('timestamp')['col1'].eq(1)
out = s.idxmax() if s.any() else None
print (out)
None
票数 4
EN

Stack Overflow用户

发布于 2022-03-04 12:36:01

使用idxmax获取0/1s中第一个1的索引:

代码语言:javascript
复制
df.loc[df['col1'].idxmax(), 'timestamp']

或者在有其他值的情况下获得第一个1

代码语言:javascript
复制
df.loc[df['col1'].eq(1), 'timestamp'].iat[0]

输出:'2021-01-11 13:00'

确保存在价值:

代码语言:javascript
复制
s = df.loc[df['col1'].eq(1), 'timestamp']
s.iat[0] if len(s) else 'no value'

或者作为一个班轮:

代码语言:javascript
复制
s.iat[0] if len(s:=df.loc[df['col1'].eq(1), 'timestamp']) else 'no value'

输出如果no 1:no value

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71351485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档