Python 在数据帧中识别并发事件的简单方法

Python 在数据帧中识别并发事件的简单方法,python,pandas,concurrency,Python,Pandas,Concurrency,我正在寻找一种简单的方法,向数据框添加一列,以指示给定部件是否已连续购买至少两年 下面是一个数据帧示例 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] }

我正在寻找一种简单的方法,向数据框添加一列,以指示给定部件是否已连续购买至少两年

下面是一个数据帧示例

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,因为它没有连续两年购买

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