Простой способ идентифицировать параллельные события в панде - PullRequest
2 голосов
/ 30 июня 2019

Я ищу простой способ добавить столбец в фрейм данных, который указывает, была ли данная деталь куплена хотя бы два года подряд

Вот пример фрейма данных

df = pd.DataFrame(
    {
        'PART_UNIT':['A','A','A','B','B'],
        'FiscalYear':['2015/2016','2016/2017','2018/2019','2015/2016','2017/2018'],
        'PO_UNIT_PRICE':[10,12,11,45,54]
    }
)
print(df)

0         A  2015/2016             10
1         A  2016/2017             12
2         A  2018/2019             11
3         B  2015/2016             45
4         B  2017/2018             54

Я ищу функцию, аналогичную той, которую я использовал бы при добавлении столбца стандартного отклонения

df['std'] = df.groupby(['PART_UNIT'])['PO_UNIT_PRICE'].transform(np.std)

, чтобы получить такой результат

  PART_UNIT FiscalYear  PO_UNIT_PRICE  Concurrent
0         A  2015/2016             10           1
1         A  2016/2017             12           1
2         A  2018/2019             11           1
3         B  2015/2016             45           0
4         B  2017/2018             54           0

Как вы можете видетьчасть "B" получает 0 в столбце, поскольку она не была куплена два года подряд.

1 Ответ

1 голос
/ 30 июня 2019
import pandas as pd

df = pd.DataFrame(
    {
        'PART_UNIT': ['A', 'A', 'A', 'B', 'B'],
        'FiscalYear': ['2015/2016', '2016/2017', '2018/2019', '2015/2016', '2017/2018'],
        'PO_UNIT_PRICE': [10, 12, 11, 45, 54]
    }
)

print(df)


def two_years_in_a_row(fiscal_years):
    tmp = list(fiscal_years)
    for idx, year in enumerate(tmp):
        if idx > 0:
            if tmp[idx - 1].split('/')[1] == year.split('/')[0]:
                return 1
    return 0


print('----------------------------------------')

df['concurrent'] = df.groupby(['PART_UNIT'])['FiscalYear'].transform(two_years_in_a_row)

print(df)

выход

 PART_UNIT FiscalYear  PO_UNIT_PRICE
0         A  2015/2016             10
1         A  2016/2017             12
2         A  2018/2019             11
3         B  2015/2016             45
4         B  2017/2018             54
----------------------------------------
  PART_UNIT FiscalYear  PO_UNIT_PRICE  concurrent
0         A  2015/2016             10           1
1         A  2016/2017             12           1
2         A  2018/2019             11           1
3         B  2015/2016             45           0
4         B  2017/2018             54           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...