在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