我有一个包含以下列的数据框:
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]
开头。
我尝试的唯一方法是创建两个数据透视表并计算每个元素的差异,但我认为使用矢量化应该有更有效的方法吗?
非常感谢。
答案 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
如果您需要按会员计算,则需要提供更大的数据样本,并为更大的数据集准确显示所需的输出。