python - 将 groupby 的第一个值设置为 Nan

标签 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    

我需要计算所有 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_valuesGroupBy.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/

相关文章:

python - 当我在Python中运行文件时出现ValueError

python - Pandas:根据条件将数据从 df 提取到新的 df

python - 从 excel 加载数据并附加所有工作表

Python Pandas : How to Insert one Missing Row?

python - gcloud SDK 中的 bq 在虚拟环境中不起作用

python - 在 Python 中使用 SQLAlchemy 连接到 Azure 数据库

python - 使用 Flask 路由捕获整数列表

python - 删除列表中包含值的行

python - 如何在 Pandas 中更改索引和转置

python - 将按 pandas 数据框(多个但不是所有列)分组的数据从长转换为宽