Python 将groupby的第一个值设置为Nan

Python 将groupby的第一个值设置为Nan,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个不同类别的时间序列 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 我需要计算所有资产的回报,使用 df['ret'] = df['price'] / df['price'].s

我有一个不同类别的时间序列

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    
我需要计算所有资产的回报,使用

df['ret'] = df['price'] / df['price'].shift(1) - 1
然而,这也会根据上一家公司的最后一次观察结果,计算出每个公司(A除外)的第一个要素的不正确回报。因此,我想在每一个类别中首先进行观察

使用计算机很容易获得这些观察结果

df.groupby('cat')['ret'].first()
但我对如何设置它们有点迷茫

df.groupby('cat')['ret'].first() = np.NaN


没有导致任何结果。

要将每组的第一个值设置为缺失值,请使用:

但似乎需要:

您的解决方案应更改为:

试试这个

df.sort_values('date').groupby('cat')['price'].pct_change()


您需要
pct\u更改()
pct\u更改
需要在组内执行
df.loc[~df['cat'].duplicated(), 'ret']=np.NaN
df = df.sort_values(['cat','date'])
df['ret1'] = df.groupby('cat')['price'].pct_change()
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
df.sort_values('date').groupby('cat')['price'].pct_change()