首页 > 解决方案 > 在 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

我想生成一个名为 Date 的新列。首先,我按文章对数据进行分组。那么对于每个文章组,如果 Row 为 1,则 Date 中的值与 Day 中的值相同。否则,将第一天中的所有值向上移动并将最后一个值设置为 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

我认为这可以通过 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。但我有同样的错误。

标签: pythonpandasif-statementtransform

解决方案


国际大学联盟:

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

推荐阅读