我有不同类别的时间序列
cat date price
A 2000-01-01 100
A 2000-02-01 101
...
A 2010-12-01 140
B 2000-01-01 10
B 2000-02-01 10.4
...
B 2010-12-01 11.1
...
Z 2010-12-01 13.1
我需要计算所有 Assets 的返回,使用起来非常快
df['ret'] = df['price'] / df['price'].shift(1) - 1
但是,这也会根据前一家公司的最后观察结果计算每个公司的第一个元素(A 除外)的错误返回。因此,我想将每个类别中的第一个观察结果设为 NaN。
使用以下方法很容易获得这些观察结果
df.groupby('cat')['ret'].first()
但我对如何设置它们有点迷失。
df.groupby('cat')['ret'].first() = np.NaN
和
df.loc[df.groupby('cat')['ret'].first(), 'ret']=np.NaN
没有导致任何地方。
最佳答案
要将每组的第一个值设置为缺失值,请使用 Series.duplicated
:
df.loc[~df['cat'].duplicated(), 'ret']=np.NaN
但似乎需要DataFrame.sort_values
与 GroupBy.pct_change
:
df = df.sort_values(['cat','date'])
df['ret1'] = df.groupby('cat')['price'].pct_change()
您的解决方案应更改为 DataFrameGroupBy.shift
:
df['ret2'] = df['price'] / df.groupby('cat')['price'].shift(1) - 1
print (df)
cat date price ret1 ret2
0 A 2000-01-01 100.0 NaN NaN
1 A 2000-02-01 101.0 0.010000 0.010000
2 A 2010-12-01 140.0 0.386139 0.386139
3 B 2000-01-01 10.0 NaN NaN
4 B 2000-02-01 10.4 0.040000 0.040000
5 B 2010-12-01 11.1 0.067308 0.067308
6 Z 2010-12-01 13.1 NaN NaN
关于python - 将 groupby 的第一个值设置为 Nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56924062/