在Python中,如何执行groupby+;转换+;设计用于移动一列中的值的函数?

在Python中,如何执行groupby+;转换+;设计用于移动一列中的值的函数?,python,pandas,if-statement,transform,Python,Pandas,If Statement,Transform,我的数据如下: ARTICLE Day Row a 2 10 a 3 10 a 4 10 a 5 10 a 6 10 a 7 10 a 8 10 a 9 10 a 10 10 a 11 10 b 3 1

我的数据如下:

   ARTICLE  Day  Row
        a    2   10
        a    3   10
        a    4   10
        a    5   10
        a    6   10
        a    7   10
        a    8   10
        a    9   10
        a   10   10
        a   11   10
        b    3    1
   ARTICLE  Day  Row    Date
        a    2   10      3
        a    3   10      4
        a    4   10      5
        a    5   10      6
        a    6   10      7
        a    7   10      8
        a    8   10      9
        a    9   10      10
        a   10   10      11
        a   11   10      100
        b    3    1      3
我想生成一个名为Date的新列。首先,我将数据按文章进行分组。然后,对于每个文章组,如果行为1,则Date中的值与Day中的值相同。否则,将第一天的所有值向上移动一步,并将最后一个值设置为100。因此,新数据应如下所示:

   ARTICLE  Day  Row
        a    2   10
        a    3   10
        a    4   10
        a    5   10
        a    6   10
        a    7   10
        a    8   10
        a    9   10
        a   10   10
        a   11   10
        b    3    1
   ARTICLE  Day  Row    Date
        a    2   10      3
        a    3   10      4
        a    4   10      5
        a    5   10      6
        a    6   10      7
        a    7   10      8
        a    8   10      9
        a    9   10      10
        a   10   10      11
        a   11   10      100
        b    3    1      3
我假设这可以通过groupby和transform实现。函数用于生成日期。所以,我的代码是:

def myFUN_PostDate1(NRow,Date):
    if (NRow.unique()==1):
        return Date
    else:
        Date1 = Date[1:Date.shape[0]]
        Date1[Date1.shape[0] + 1] = 19800312
        return Date1

a = pd.DataFrame({'ARTICLE': ['a','a','a','a','a','a','a','a','a','a','b'],
                  'Day': [2,3,4,5,6,7,8,9,10,11,3],
                  'Row':[10,10,10,10,10,10,10,10,10,10,1]})
a.loc[:,'Date'] = a.groupby(['ARTICLE']).transform(lambda x: myFUN_PostDate1(x.loc[:,'Row'],x.loc[:,'Day']))
但我有错误信息:

pandas.core.indexing.IndexingError: ('Too many indexers', 'occurred at index Day')
我还尝试了groupby+np.where。但我也犯了同样的错误。

IIUC:

In [14]: df['Date'] = (df.groupby('ARTICLE')['Day']
                         .apply(lambda x: x.shift(-1).fillna(100) if len(x) > 1 else x))

In [15]: df
Out[15]:
   ARTICLE  Day  Row   Date
0        a    2   10    3.0
1        a    3   10    4.0
2        a    4   10    5.0
3        a    5   10    6.0
4        a    6   10    7.0
5        a    7   10    8.0
6        a    8   10    9.0
7        a    9   10   10.0
8        a   10   10   11.0
9        a   11   10  100.0
10       b    3    1    3.0