根据其他列中的行值计算数据框中行值之间的差异

时间:2020-03-09 16:23:32

标签: python pandas

如何计算每年的行值之间的差,如何在年份更改时重新开始计算?

我有以下数据框:

df = pd.DataFrame({'year': [2010, 2010, 2010, 2011, 2011, 2011],
               'measurement1': [1, 3, 5, 2, 3, 6], 
              'measurement2': [2, 1, 1, 3, 2, 4]})

将年份设置为数据框中的索引,以便不计算年份之间的差异。 df = df.set_index('year')

我想得到的结果是以下数据框:

df_result = pd.DataFrame({'year': [2010, 2010, 2010, 2011, 2011, 2011],
               'measurement1': [0, 2, 2, 0, 1, 3], 
              'measurement2': [0, 1, 0, 0, 1, 2]})

您可以看到,差异是每年计算的。当我们有一个新的一年的度量值时,计算将再次从新的开始。如果使用.diff方法,则还将计算连续年份之间的差额。

如何计算仅在一年内测得的值之间的差异?

非常感谢!

2 个答案:

答案 0 :(得分:2)

使用熊猫groupby按年份分组,然后应用diff()

grouped = df.groupby("year").diff()

答案 1 :(得分:0)

由于转换并非易事,因此我将定义一个函数:

def delta(x):
    y = (x.shift().bfill() - x)
    return(np.where(y>=0, y, -y))

然后groupby transform将开始工作:

df = pd.DataFrame({'year': [2010, 2010, 2010, 2011, 2011, 2011],
               'measurement1': [1, 3, 5, 2, 3, 6], 
              'measurement2': [2, 1, 1, 3, 2, 4]}).set_index('year')

df_resul = df.groupby(level=0).transform(delta).astype(int)

它给出:

      measurement1  measurement2
year                            
2010             0             0
2010             2             1

(只需使用reset_index即可获得预期的数据帧)