使用两列进行百分比更改,一列已移位

时间:2018-05-28 16:27:21

标签: python dataframe vectorization percentage

我有一个包含以下列的数据框:

member (float64), datetime (datetime64[ns]), var1(float64), var2(float64)

如何计算var1的每个元素与1步滞后var2之间的百分比变化,每个成员执行此操作?结果应创建为新列。

    var1     var2  member      datetime       expected new column
   131.255  137.032  1   2017-02-02 09:15:00   n/a
   129.700  131.193  1   2017-02-02 09:20:00  -0.05351 ((129.7-137.032)/137.032)

然后,新列将以每个“成员”var1[1]-var2[0]/var2[0]开头。 我尝试的唯一方法是创建两个数据透视表并计算每个元素的差异,但我认为使用矢量化应该有更有效的方法吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

对数据进行排序,使属于同一成员的行彼此相邻。

df = df.sort_values(['member', 'datetime'])

为每个成员组创建一个移位var2的数组

shifted = df.groupby('member').var2.shift() # the default shifts by 1, which is needed here

使用移位数组分配新列进行计算

df['newcol'] = (df.var1 - shifted) / shifted

这会添加额外的列

      var1     var2  member             datetime    newcol
0  131.255  137.032       1  2017-02-02 09:15:00       NaN
1  129.700  131.193       1  2017-02-02 09:20:00 -0.053506

或者,在一行中完成:

df['newcol'] = df.var1/df.groupby('member').var2.shift()-1

答案 1 :(得分:0)

这是使用pd.Series.shift的一种方式:

df['ratio'] = (df['var1'] / df['var2'].shift()) - 1

print(df)

      var1     var2  member     ratio
0  131.255  137.032       1       NaN
1  129.700  131.193       1 -0.053506

如果您需要按会员计算,则需要提供更大的数据样本,并为更大的数据集准确显示所需的输出。