В Python как сделать groupby + transform + специально разработанную функцию для перемещения значений в одном столбце? - PullRequest
0 голосов
/ 01 мая 2018

Мои данные таковы:

   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. Во-первых, я группирую данные по СТАТЬЕ. Затем для каждой группы товаров, если строка равна 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. Но у меня та же ошибка.

Я действительно не могу этого понять. Может ли кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 01 мая 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...