Python pandas-从组中获取N个最后值
我有一个类似的数据框(日期的格式为:Python pandas-从组中获取N个最后值,python,algorithm,pandas,group-by,Python,Algorithm,Pandas,Group By,我有一个类似的数据框(日期的格式为:dd/mm/yyyy): 我需要做的是,根据Param1和Param2进行分组,并为前3个值创建N个(在我的情况下,是3个)附加列,这些值距离当前行至少30天。 所以输出应该是这样的: Param1 Param2 date value prev_1 prev_2 prev_3 1 a b 30/10/2007 5 None None None 2 a b
dd/mm/yyyy
):
我需要做的是,根据Param1
和Param2
进行分组,并为前3个值创建N个(在我的情况下,是3个)附加列,这些值距离当前行至少30天。
所以输出应该是这样的:
Param1 Param2 date value prev_1 prev_2 prev_3
1 a b 30/10/2007 5 None None None
2 a b 31/10/2007 8 None None None
3 a b 01/11/2007 9 None None None
4 a b 01/12/2007 3 9 8 5
5 a b 02/12/2007 2 9 8 5
6 a b 01/03/2008 11 2 3 9
7 b c 05/10/2008 7 None None None
8 b c 06/10/2008 13 None None None
9 b c 07/10/2008 19 None None None
10 b c 08/11/2008 22 19 13 7
11 b c 09/11/2008 35 19 13 7
12 b c 08/12/2008 5 22 19 13
我试过使用set\u index
,stack
和相关函数,但我就是想不出来(没有一个难看的for
)
任何帮助都将不胜感激
编辑:虽然与此问题类似:
这并不完全相同,因为您不能进行简单的轮班
,因为您需要检查至少30天间隔的情况 以下是我的建议:
data.date = pd.to_datetime(data.date, dayfirst=True)
data['ind'] = data.index
def func(a):
aa = data[(data.ind<a.ind)\
&(data.Param1==a.Param1)&(data.Param2==a.Param2)&(data.date<=(a.date-np.timedelta64(30, 'D')))]
aaa = [np.nan]*3+list(aa.value.values)
aaaa = pd.Series(aaa[::-1][:3], index=['prev_1', 'prev_2', 'prev_3'])
return pd.concat([a, aaaa])
data.apply(func, 1).drop('ind',1)
data.date=pd.to\u datetime(data.date,dayfirst=True)
数据['ind']=data.index
def func(a):
aa=data[(data.ind它的可能副本并不是一个完美的解决方案,因为它使用了顺序应用
,这或多或少相当于对于
,但由于这是我得到的最好(并且只有:)答案,我会接受它。谢谢!谢谢,如果你找到非顺序解决方案,请告诉我们,我打赌是有的。
data.date = pd.to_datetime(data.date, dayfirst=True)
data['ind'] = data.index
def func(a):
aa = data[(data.ind<a.ind)\
&(data.Param1==a.Param1)&(data.Param2==a.Param2)&(data.date<=(a.date-np.timedelta64(30, 'D')))]
aaa = [np.nan]*3+list(aa.value.values)
aaaa = pd.Series(aaa[::-1][:3], index=['prev_1', 'prev_2', 'prev_3'])
return pd.concat([a, aaaa])
data.apply(func, 1).drop('ind',1)