我试图按组选择满足条件的最短日期并将其分配给新列:
Group bool date
A n 2000-01-01
A n 2000-03-02
A y 2000-04-10
A y 2001-01-01
B n 2000-02-20
B y 2000-03-15
B y 2000-04-27
B y 2001-01-10
这将成为:
Group bool date trigger_date
A n 2000-01-01 2000-04-10
A n 2000-03-02 2000-04-10
A y 2000-04-10 2000-04-10
A y 2001-01-01 2000-04-10
B n 2000-02-20 2000-03-15
B y 2000-03-15 2000-03-15
B y 2000-04-27 2000-03-15
B y 2001-01-10 2000-03-15
我一直在尝试将groupby与transform结合使用,但不知道如何根据其他列来考虑条件进行转换。
答案 0 :(得分:2)
首先将bool
列更改为实际的布尔值(也要注意您的名称.DataFrame有bool
方法):
In [51]: df['bool'] = df['bool'].replace({'n': False, 'y': True})
查找最短日期非常简单。使用bool
列索引df
:
In [51]: dates = df[df['bool']].groupby("Group")['date'].first()
In [52]: dates
Out[52]:
Group
A 2000-04-10
B 2000-03-15
Name: date, dtype: object
[2 rows x 2 columns]
可能有很多方法可以设置值,但一种方法是将Group
设置为索引,将join
设置为dates
。
In [117]: df.set_index('Group').join(dates, rsuffix='_trigger')
Out[117]:
bool date date_trigger
Group
A False 2000-01-01 2000-04-10
A False 2000-03-02 2000-04-10
A True 2000-04-10 2000-04-10
A True 2001-01-01 2000-04-10
B False 2000-02-20 2000-03-15
B True 2000-03-15 2000-03-15
B True 2000-04-27 2000-03-15
B True 2001-01-10 2000-03-15