将值应用于groupby中的最大值

时间:2015-11-20 00:45:30

标签: python-3.x pandas

我有这样的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

2 个答案:

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