我的数据是这样的:
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
我想生成一个名为"日期"的新列。首先,我按文章对数据进行分组。然后,对于每个文章组,如果 Row 为 1,则 Date 中的值与 Day 中的值相同。否则,将第 1 天中的所有值向上移动,并将最后一个值设置为 100。因此,新数据应如下所示:
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
我认为这可以通过分组和转换来完成。使用函数来生成日期。所以,我的代码是:
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