我有这样的DF:
ID Time
1 20:29
1 20:45
1 23:16
2 11:00
2 13:00
3 01:00
我想创建一个新列,在每个ID分组中将最大时间值放在1旁边,如下所示:
ID Time Value
1 20:29 0
1 20:45 0
1 23:16 1
2 11:00 0
2 13:00 1
3 01:00 1
我知道答案涉及一个groupby机制,并且正在摆弄类似的东西:
df.groupby('ID')['Time'].max() = 1
答案 0 :(得分:0)
我们的想法是编写一个匿名函数,该函数可以对您的每个群组进行操作,并使用apply
将其提供给您的群组:
df['Value']=df.groupby('ID',as_index=False).apply(lambda x : x.Time == max(x.Time)).values
答案 1 :(得分:0)
假设您的“时间”列已经是datetime64
,那么您希望在“ID”列上groupby
,然后调用transform
以应用lambda来创建一个包含索引与原始df对齐:
In [92]:
df['Value'] = df.groupby('ID')['Time'].transform(lambda x: (x == x.max())).dt.nanosecond
df
Out[92]:
ID Time Value
0 1 2015-11-20 20:29:00 0
1 1 2015-11-20 20:45:00 0
2 1 2015-11-20 23:16:00 1
3 2 2015-11-20 11:00:00 0
4 2 2015-11-20 13:00:00 1
5 3 2015-11-20 01:00:00 1
dt.nanosecond
调用是因为由于某种原因返回的dtype是一个日期时间而不是布尔值:
In [93]:
df.groupby('ID')['Time'].transform(lambda x: (x == x.max()))
Out[93]:
0 1970-01-01 00:00:00.000000000
1 1970-01-01 00:00:00.000000000
2 1970-01-01 00:00:00.000000001
3 1970-01-01 00:00:00.000000000
4 1970-01-01 00:00:00.000000001
5 1970-01-01 00:00:00.000000001
Name: Time, dtype: datetime64[ns]