我有以下熊猫资料df
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。
这是我目前的解决方案:
first = None
for index,row in df.iterrows():
if row["col1"] == 1:
if not first:
first = row["timestamp"]
break我如何简化它,使它更快?
发布于 2022-03-04 12:35:30
如果至少匹配一个值,则解决方案:
如果只有0和1值,则使用Series.idxmax
out = df.loc[df['col1'].idxmax(),'timestamp']或者,如果可能的话,另一个像0, 1这样的值通过1进行比较
out = df.loc[df['col1'].eq(1).idxmax(),'timestamp']或者首先创建DatetimeIndex:
out = df.set_index('timestamp')['col1'].idxmax()print (out)
2021-01-11 13:00:00任何值的解决方案-如果没有匹配的idxmax返回第一个值,那么可能的解决方案:
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发布于 2022-03-04 12:36:01
使用idxmax获取0/1s中第一个1的索引:
df.loc[df['col1'].idxmax(), 'timestamp']或者在有其他值的情况下获得第一个1:
df.loc[df['col1'].eq(1), 'timestamp'].iat[0]输出:'2021-01-11 13:00'
确保存在价值:
s = df.loc[df['col1'].eq(1), 'timestamp']
s.iat[0] if len(s) else 'no value'或者作为一个班轮:
s.iat[0] if len(s:=df.loc[df['col1'].eq(1), 'timestamp']) else 'no value'输出如果no 1:no value
https://stackoverflow.com/questions/71351485
复制相似问题