在 Python 中,如何做 groupby + 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

我想生成一个名为"日期"的新列。首先,我按文章对数据进行分组。然后,对于每个文章组,如果 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

最新更新