pandas - 将 pct_change 与多索引 groupby 一起使用

标签 pandas pandas-groupby

我正在尝试对 groupby 的结果使用 pct_change,以便计算许多不同项目的值(value)周期变化。

我的数据结构如下:

import numpy as np
arrays = [np.array([1,2,3,4,1,2,3,4]),np.array(['bar', 'bar', 'bar', 'bar', 'foo', 'foo', 'foo', 'foo'])]
s = pd.Series(np.array([100,101,102,103,200,201,202,203]), index=arrays)
s.name='values'
df = pd.DataFrame(s, index=arrays).sort_index()
df.index.names =['day','symbol']

我需要计算每天每个交易品种的百分比变化。当我运行这样的东西时:

df.groupby(level='symbol').values.diff()

我得到了正确的输出。但是当我运行这个时:

df.groupby(level='symbol').values.pct_change()

它返回错误的结果(将 bar 与 foo 进行比较)

我可以通过像这样包装在 lambda 中来获得我正在寻找的东西:

my_func = lambda x: x.pct_change()
df.groupby(level='symbol').values.apply(my_func)

或者这样做:

df.groupby(level='symbol').values.diff() / df.groupby(level='symbol').values.shift(1)

所以我真的只是想了解 pct_change 与其他 pandas 方法的行为差异的原因。

最佳答案

对于 pandas 0.24.2 上的多索引数据帧,此解决方案对我有用:

pd.__version__

'0.24.2'


df.groupby(level='symbol')['values'].pct_change()


    day  symbol
1    bar            NaN
     foo            NaN
2    bar       0.010000
     foo       0.005000
3    bar       0.009901
     foo       0.004975
4    bar       0.009804
     foo       0.004950
Name: values, dtype: float64

关于pandas - 将 pct_change 与多索引 groupby 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50915213/

相关文章:

python - pandas 和文件系统可以替代数据库吗?

python - 使用 pandas 和 numpy 参数化堆栈溢出的用户数和声誉

python - 如何获取 Pandas 中的 'cardinal' 一年中的哪一天?

python - 如何将列添加到多索引 DataFrame?

python - 使用索引条目之间的索引值查询数据帧

python - 添加一个虚拟值,指示分组数据框中连续行之间的变化

python - 如何从 Pandas GroupBy 对象中获取分组列的名称?

python - 如何返回涉及 Pandas 中两列的特定条件的行?

python - 在 pandas 数据框中创建新列,合并特定列名称和相应的值

python - Pandas ,申请后保持分组