根据if语句分组

时间:2019-01-03 08:15:38

标签: pandas if-statement pandas-groupby

我有一个包含ID和时间戳的DF。

我一直在寻找分组依据,然后是两行中时间戳的条件。 类似于如果timestamp_col1> timestamp_col1用于第二行,则为1,否则为2

基本上将id和if语句分组,如果第一行时间戳是<而不是第二行,则if语句的值为1;如果第二行时间戳是<那么第一行的时间戳,则if语句为2

df sample below

更新后的输出,其中最后两个值应为2 Updated Output

1 个答案:

答案 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