我有熊猫数据框,其中有两列,
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
我尝试了使用熊猫过滤技术,但我未能应用多个条件,而第二个条件是最近几个月。
答案 0 :(得分:4)
首先使用to_datetime
,按DataFrame.sort_values
按两列排序,按Series.dt.strftime
将Month
列转换回原始格式,然后调用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)