我有一个包含ID和时间戳的DF。
我一直在寻找分组依据,然后是两行中时间戳的条件。 类似于如果timestamp_col1> timestamp_col1用于第二行,则为1,否则为2
基本上将id和if语句分组,如果第一行时间戳是<而不是第二行,则if语句的值为1;如果第二行时间戳是<那么第一行的时间戳,则if语句为2
答案 0 :(得分:0)
使用to_timedelta
来转换time
,然后汇总第一个值和最后一个值之间的差,并按gt
(>
),最后map
与{ {3}}用于分配新列:
df = pd.DataFrame({
'ID Code': ['a','a','b','b'],
'Time Created': ['21:25:27','21:12:09','21:12:00','21:12:40']
})
df['Time Created'] = pd.to_timedelta(df['Time Created'])
mask = df.groupby('ID Code')['Time Created'].agg(lambda x: x.iat[0] < x.iat[-1])
print (mask)
ID Code
a True
b False
Name: Time Created, dtype: bool
df['new'] = np.where(df['ID Code'].map(mask), 1, 2)
print (df)
ID Code Time Created new
0 a 21:25:27 2
1 a 21:12:09 2
2 b 21:12:00 1
3 b 21:12:40 1
另一种使用numpy.where
的解决方案,用于将汇总值返回到新列,此处为布尔掩码:
df['Time Created'] = pd.to_timedelta(df['Time Created'])
mask = (df.groupby('ID Code')['Time Created'].transform(lambda x: x.iat[0] > x.iat[-1]))
print (mask)
0 True
1 True
2 False
3 False
Name: Time Created, dtype: bool
df['new'] = np.where(mask, 2, 1)
print (df)
ID Code Time Created new
0 a 21:25:27 2
1 a 21:12:09 2
2 b 21:12:00 1
3 b 21:12:40 1