按过去3个月和ID过滤数据

时间:2019-05-07 10:32:13

标签: python pandas

我有熊猫数据框,其中有两列,

    ID   Month

    1    Jan-18
    1    Dec-17
    1    Feb-18
    1    Nov-17
    1    Oct-17
    1    Sep-17
    2    Jan-18
    2    Dec-17
    2    Feb-18
    2    Nov-17
    2    Oct-17
    2    Mar-18

我想通过ID获取最近3个月的数据

预期的输出

    ID   Month

    1    Dec-17
    1    Jan-18
    1    Feb-18

    2    Jan-18
    2    Feb-18
    2    Mar-18

我尝试了使用熊猫过滤技术,但我未能应用多个条件,而第二个条件是最近几个月。

2 个答案:

答案 0 :(得分:4)

首先使用to_datetime,按DataFrame.sort_values按两列排序,按Series.dt.strftimeMonth列转换回原始格式,然后调用GroupBy.tail

df['Month'] = pd.to_datetime(df['Month'], format='%b-%y')
df1 = (df.sort_values(['ID','Month'])
         .assign(Month=df['Month'].dt.strftime('%b-%y'))
         .groupby('ID')
         .tail(3))
print (df1)
    ID   Month
1    1  Dec-17
0    1  Jan-18
2    1  Feb-18
6    2  Jan-18
8    2  Feb-18
11   2  Mar-18

具有月度周期的另一个解决方案:

df['Month'] = pd.to_datetime(df['Month'], format='%b-%y').dt.to_period('m')
df1 = (df.sort_values(['ID','Month'])
         .groupby('ID')
         .tail(3))
print (df1)
    ID    Month
1    1  2017-12
0    1  2018-01
2    1  2018-02
6    2  2018-01
8    2  2018-02
11   2  2018-03

答案 1 :(得分:0)

不带assign()

的选项
df['Month'] = pd.to_datetime(df['Month'], format='%b-%y')
df2=df.sort_values(by=['ID','Month']).groupby('ID').tail(3)
df2['Month'] = df['Month'].dt.strftime('%b-%y')
print(df2)