Pandas不同基准年时差的计算

smdncfj3  于 2023-02-27  发布在  其他
关注(0)|答案(2)|浏览(119)

假设我有以下数据:

d = {'origin': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'], 'destination': ['b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c'], 'year': [2000, 2001, 2002, 2003, 2004, 2005, 2000, 2001, 2002, 2003, 2004, 2005], 'value': [10, 17, 22, 7, 8, 14, 10, 2, 5, 7, 78, 23] }
data_frame  = pd.DataFrame(data=d)
data_frame.set_index(['origin', 'destination'], inplace=True)
data_frame

我想要实现的是以下内容:我想要计算两种情况下每个起点-目的地对(作为索引给出)相对于列value的时间差。
在第一种情况下,我希望以2000年为基数,这样,相应的值将从以后年份(包括2000年)的值中减去,一旦年份到达2003年,则基数年将变为2003年,并继续减去。
如果有一点不清楚,下面是我想要实现的最终数据集

d = {'origin': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'], 'destination': ['b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c'], 'year': [2000, 2001, 2002, 2003, 2004, 2005, 2000, 2001, 2002, 2003, 2004, 2005], 'value': [10, 17, 22, 7, 8, 14, 10, 2, 5, 7, 78, 23],  'diff': [0, 7, 12, 0, 1, 7, 0, -8, -5, 0, 71, 16], }
data_frame  = pd.DataFrame(data=d)
data_frame.set_index(['origin', 'destination'], inplace=True)
data_frame

对于每一个始发地-目的地对,以2000年为基准年计算差值,然后切换到2003年。
谢谢你的帮忙

xkrw2x1b

xkrw2x1b1#

如果没有匹配的2000,2003,您可以通过将value替换为缺失值来创建Series用于减法,然后向前填充每组的NaN

s = (data_frame['value'].where(data_frame['year'].isin([2000, 2003]))
                        .groupby(level=[0,1])
                        .ffill())
data_frame['diff'] = data_frame['value'].sub(s)
wj8zmpe1

wj8zmpe12#

def calc(data_frame):
  if data_frame['year'] < 2003:
    x = data_frame['value'] - 10
    return x
  else:
    y = data_frame['value'] - 7
    return y

data_frame['diff'] = data_frame.apply(calc, axis=1)

相关问题