我想过滤掉每组“行情收录器”中的列,以使剩下的行仅是我在每个行情收录器中最近的时间戳之前的第1、2、3等年。例如:
数据
index date ticker dividends
0 3/31/2019 AA 0.626
1 12/31/2018 AA 0.611
2 9/30/2018 AA 0.611
3 6/30/2018 AA 0.04
4 3/31/2018 AA 0.035
5 12/31/2017 AA 0.02
6 12/31/2018 CC 0.035
7 6/30/2018 CC 0.075
8 12/31/2017 CC 0.04
9 12/31/2016 CC 0.035
10 12/31/2015 CC 0.04
11 6/30/2015 CC 0.06
我想要:
index date ticker dividends
0 3/31/2019 AA 0.626
4 3/31/2018 AA 0.035
6 12/31/2018 CC 0.035
8 12/31/2017 CC 0.04
9 12/31/2016 CC 0.035
10 12/31/2015 CC 0.04
我已经把data.groupby('ticker')。filter弄混了一段时间,但是我只是想不出一种pythonic的方式来做到这一点,特别是考虑到每组“ ticker”最近的日期不一定总是相同,并且每个组中日期之间的间隔也不同。
答案 0 :(得分:3)
从日期列创建日期系列:
d = pd.to_datetime(df['date'])
获取每个股票代号的最新日期:
r = d.groupby(df['ticker']).transform('max')
从DF中获取月/日组成部分相同的行:
new_df = df[d.dt.month.eq(r.dt.month) & d.dt.day.eq(r.dt.day)]
这给您:
date ticker dividends
index
0 3/31/2019 AA 0.626
4 3/31/2018 AA 0.035
6 12/31/2018 CC 0.035
8 12/31/2017 CC 0.040
9 12/31/2016 CC 0.035
10 12/31/2015 CC 0.040
答案 1 :(得分:0)
您可以编写一个函数:
def filt(group):
first_day = group.iloc[0, 1]
return (group['date'].dt.day==first_day.day) & (group['date'].dt.month==first_day.month)
然后过滤掉:
df['date'= = pd.to_datetime(df['date'])
df[df.groupby('ticker').apply(filt).values]
index date ticker dividends
0 3/31/2019 AA 0.626
4 3/31/2018 AA 0.035
6 12/31/2018 CC 0.035
8 12/31/2017 CC 0.04
9 12/31/2016 CC 0.035
10 12/31/2015 CC 0.04
该函数的输出为:
df.groupby('ticker').apply(filt)
ticker
AA 0 True
1 False
2 False
3 False
4 True
5 False
CC 6 True
7 False
8 True
9 True
10 True
11 False