筛选出与上一年不完全相同的组中的数据框行

时间:2019-06-09 07:45:13

标签: python pandas dataframe pandas-groupby

我想过滤掉每组“行情收录器”中的列,以使剩下的行仅是我在每个行情收录器中最近的时间戳之前的第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”最近的日期不一定总是相同,并且每个组中日期之间的间隔也不同。

2 个答案:

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