Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pandas-从组中获取N个最后值_Python_Algorithm_Pandas_Group By - Fatal编程技术网

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)