Создать новый столбец - присваивать только последнее значение по группе - PullRequest
0 голосов
/ 24 октября 2019

Предположим, у меня есть следующий фрейм данных:

        date    sku        Q     f   
0   2019-10-23  1101692 10.000  001 
1   2019-10-24  1101692 10.000  002 
2   2019-10-23  1101692 15.000  007 
3   2019-10-22  1101692 -10.000 100 
4   2019-10-23  1101692 -10.000 100 
5   2019-10-23  1101692 -15.000 100 
6   2019-10-21  1101692 600.000 100 

Используя эту команду groupby, чтобы получить последнее значение по группе:

df.groupby(['sku', 'f']).last()

Я получил:

              data        q 
sku      f          
1101692 001 2019-10-23  10.000  
        002 2019-10-24  10.000  
        007 2019-10-23  15.000  
        100 2019-10-21  600.000 

Я пытаюсь создать новый столбец, который будет иметь значения столбца 'q' (последние значения каждой группы).

Ожидаемый результат:

         date    sku        Q     f  New_column 
0   2019-10-23  1101692 10.000  001    10.000
1   2019-10-24  1101692 10.000  002    10.000
2   2019-10-23  1101692 15.000  007    15.000
3   2019-10-22  1101692 -10.000 100     NaN
4   2019-10-23  1101692 -10.000 100     NaN
5   2019-10-23  1101692 -15.000 100     NaN
6   2019-10-21  1101692 600.000 100    600.000

Что является хорошим подходом для создания этой новой колонки. Я попытался использовать iloc, но это кажется уловкой.

Затем я попытался использовать

df['new_column'] = df.groupby(['sku', 'f'])['q'].apply(lambda x: x.index[0])

, но это не сработало.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Способ назначения df обратно - через merge

df.merge(df.groupby(['sku', 'f'], as_index=False).last().rename(columns={'Q':'q'}), 
         on=['sku', 'f', 'date'], 
         how='outer')

         date      sku      Q    f      q
0  2019-10-23  1101692   10.0    1   10.0
1  2019-10-24  1101692   10.0    2   10.0
2  2019-10-23  1101692   15.0    7   15.0
3  2019-10-22  1101692  -10.0  100    NaN
4  2019-10-23  1101692  -10.0  100    NaN
5  2019-10-23  1101692  -15.0  100    NaN
6  2019-10-21  1101692  600.0  100  600.0
1 голос
/ 24 октября 2019

Используйте callable с loc

df['New_column'] = df.loc[lambda x: x.groupby(['sku', 'f']).tail(1).index, 'Q']

Out[581]:
         date      sku      Q    f  New_column
0  2019-10-23  1101692   10.0    1        10.0
1  2019-10-24  1101692   10.0    2        10.0
2  2019-10-23  1101692   15.0    7        15.0
3  2019-10-22  1101692  -10.0  100         NaN
4  2019-10-23  1101692  -10.0  100         NaN
5  2019-10-23  1101692  -15.0  100         NaN
6  2019-10-21  1101692  600.0  100       600.0

Примечание: если вам не нравится callable, вы можете попробовать df groupby: df.loc[df.groupby(['sku', 'f']).tail(1).index, 'Q']

1 голос
/ 24 октября 2019

Вам не нужно groupby() здесь, вы можете просто сделать:

df['new_col'] = df['Q'].mask(df.duplicated(['sku', 'f'], keep='last'))

Вывод:

         date      sku      Q    f  new_col
0  2019-10-23  1101692   10.0    1     10.0
1  2019-10-24  1101692   10.0    2     10.0
2  2019-10-23  1101692   15.0    7     15.0
3  2019-10-22  1101692  -10.0  100      NaN
4  2019-10-23  1101692  -10.0  100      NaN
5  2019-10-23  1101692  -15.0  100      NaN
6  2019-10-21  1101692  600.0  100    600.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...