Добавить новый столбец на основе другого столбца

Я хочу создать новый столбец «год-1». Значения нового столбца должны быть такими же, как в столбце "c", где x и y одинаковы, а year= year-1. А также за год-2. Это означает, что я хочу присвоить значения столбца «с» новому столбцу в предыдущем году в соответствии с x и y. Как мне это сделать?

import pandas as pd
data = {'x': [ 80.1, 90.1, 0, 300.1, 80.1, 90.1, 0, 300.1, 80.1, 90.1, 0, 300.1], 'y': [ 140.1, 150.1, 160.1, 400.1, 140.1, 150.1, 160.1, 400.1, 140.1, 150.1, 160.1, 400.1], 'a': [1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 16], 'c': [0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0], 'year': [2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2002, 2002, 2002, 2002]}   
df = pd.DataFrame(data)
df
            
             x        y     a    c      year
        
        0   80.1    140.1   1   0.0     2000
        1   90.1    150.1   2   0.0     2000
        2   0.0     160.1   3   0.0     2000
        3   300.1   400.1   4   0.0     2000
        4   80.1    140.1   5   0.0     2001
        5   90.1    150.1   10  0.0     2001
        6   0.0     160.1   11  1.0     2001
        7   300.1   400.1   12  0.0     2001
        8   80.1    140.1   13  1.0     2002
        9   90.1    150.1   14  1.0     2002
        10  0.0     160.1   15  0.0     2002
        11  300.1   400.1   16  0.0     2002

Expected output:            
              x       y     a      c     year   year-1   year-2
        
        0   80.1    140.1   1     0.0    2000   NaN       NaN
        1   90.1    150.1   2     0.0    2000   NaN       NaN
        2   0.0     160.1   3     0.0    2000   NaN       NaN
        3   300.1   400.1   4     0.0    2000   NaN       NaN
        4   80.1    140.1   5     0.0    2001   0.0       NaN
        5   90.1    150.1   10    0.0    2001   0.0       NaN
        6   0.0     160.1   11    1.0    2001   0.0       NaN
        7   300.1   400.1   12    0.0    2001   0.0       NaN
        8   80.1    140.1   13    1.0    2002   0.0       0.0
        9   90.1    150.1   14    1.0    2002   0.0       0.0 
        10  0.0     160.1   15    0.0    2002   1.0       0.0 
        11  300.1   400.1   16    0.0    2002   0.0       0.0

Ожидаемый результат должен быть частью вашего вопроса, а не одним из ответов.

edd313 09.04.2022 23:15

Я знаю, но, к сожалению, я не мог опубликовать их вместе из-за ограничений на коды. @edd313

nurer 09.04.2022 23:22

Затем вы можете уменьшить размер своей таблицы, например, включив только 2000 и 2001 годы. Проверьте Как создать минимальный воспроизводимый пример

edd313 09.04.2022 23:28

Я исправил это @edd313

nurer 09.04.2022 23:51
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

df.reset_index()\
  .merge(df.set_index(['x','y','year'])\
  .unstack()\
  .shift(axis=1)\
  .stack(dropna=False)\
  .rename(columns={'c':'year-1'})\
  .reset_index())

Выход:

    index      x      y  c  year  year-1
0       0   80.1  140.1  0  2000     NaN
1       1   90.1  150.1  0  2000     NaN
2       2    0.0  160.1  0  2000     NaN
3       3  300.1  400.1  0  2000     NaN
4       4   80.1  140.1  0  2001     0.0
5       5   90.1  150.1  0  2001     0.0
6       6    0.0  160.1  1  2001     0.0
7       7  300.1  400.1  0  2001     0.0
8       8   80.1  140.1  1  2002     0.0
9       9   90.1  150.1  1  2002     0.0
10     10    0.0  160.1  0  2002     1.0
11     11  300.1  400.1  0  2002     0.0

Подробности:

Измените структуру данных так, чтобы у вас были x, y в строках и годы в столбцах, а затем сдвиньте эти данные вправо. Измените форму фрейма данных и переименуйте столбец в «год-1» и вернитесь к исходному фрейму данных.


Что делать в следующем году:

df.reset_index()\
  .merge(df.set_index(['x','y','year'])\
  .unstack()\
  .shift(axis=1)\
  .stack(dropna=False)\
  .rename(columns={'c':'year-1'})\
  .reset_index()).merge(df.set_index(['x', 'y', 'year'])
                          .unstack()
                          .shift(2, axis=1)
                          .stack(dropna=False)
                          .rename(columns={'c':'year-2'})
                          .reset_index())

Использование functools.reduce с пониманием списка:

from functools import reduce

n=2
reduce(lambda x, y: x.merge(y), [df.set_index(['x', 'y', 'year'])
                          .unstack()
                          .shift(i, axis=1)
                          .stack(dropna=False)
                          .rename(columns={'c':f'year-{i}'})
                          .reset_index()
  for i in range(n+1)]).sort_values('year')

Выход:

        x      y  year  year-0  year-1  year-2
0     0.0  160.1  2000       0     NaN     NaN
3    80.1  140.1  2000       0     NaN     NaN
6    90.1  150.1  2000       0     NaN     NaN
9   300.1  400.1  2000       0     NaN     NaN
1     0.0  160.1  2001       1     0.0     NaN
4    80.1  140.1  2001       0     0.0     NaN
7    90.1  150.1  2001       0     0.0     NaN
10  300.1  400.1  2001       0     0.0     NaN
2     0.0  160.1  2002       0     1.0     0.0
5    80.1  140.1  2002       1     0.0     0.0
8    90.1  150.1  2002       1     0.0     0.0
11  300.1  400.1  2002       0     0.0     0.0

Если я хочу добавить год-2 при тех же условиях, как я могу это сделать? (Ожидаемый результат на второй год: NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 0, 0) @Scott Boston

nurer 10.04.2022 01:36

Теперь мы можем обобщить, используя сокращение со списком.

Scott Boston 10.04.2022 02:56

Но если у меня есть другой столбец, такой как столбец «а» во фрейме данных, он не работает. @Скотт Бостон

nurer 10.04.2022 12:38

Затем вы используете параметр on в слиянии.

Scott Boston 10.04.2022 14:09

Другие вопросы по теме