Pandas 数据框 - 如何在分组/聚合操作后保持索引?

2 投票
2 回答
5739 浏览
提问于 2025-04-18 12:41

这件事本来应该很简单,但我却遇到了一些意想不到的麻烦。下面的代码展示了我如何使用Pandas库进行分组操作,以便按符号计算方差。不幸的是,聚合命令似乎把整数索引给去掉了,所以我想创建一个新的整数列表,把它作为一列添加到表格中,并设置为新的索引。

vardataframe = voldataframe.groupby('Symbol')
vardataframe = vardataframe.aggregate(np.var)
vardataframe['newindex']= np.arange(1,(len(vardataframe)+1))
vardataframe.set_index(['newindex'])
vardataframe = vardataframe.ix[:,['newindex','Symbol','volatility']]

然而,最终的结果是下面这个vardataframe.head()的输出,它没有正确地把表格的索引从符号改回数字。这让我在尝试执行合并命令时遇到了麻烦。

        newindex  Symbol  volatility
Symbol                              
A              1     NaN    0.000249
AA             2     NaN    0.000413
AAIT           3     NaN    0.000237
AAL            4     NaN    0.001664
AAME           5     NaN    0.001283

正如你所看到的,上面的代码问题在于现在有两个符号列,而且索引没有正确设置。我想做的是去掉第二个符号列,并把newindex设置为新的索引。有人知道我哪里出错了吗?(也许是对ix命令的误解)。非常感谢!

2 个回答

0

与其手动创建一个新的索引,不如直接重置它,使用...

df = df.reset_index()
3

你可以使用 as_index=False 来保留整数索引。只需要一行代码就能完成你想要的操作:

vardataframe = voldataframe.groupby('Symbol', as_index=False).var()

关于你代码中的几个问题:

vardataframe.set_index(['newindex'])

会把 ndewindex 设置为索引,但返回的是一个新的数据框,而你并没有使用这个新数据框。如果你想这样做,可以用 vardataframe.set_index(['newindex'], inplace=True)

vardataframe.ix[:,['newindex','Symbol','volatility']]

这会给你一个全是 NaNSymbol 列,因为 Symbol 并不是 vardataframe 的一列,它只存在于索引中。用 ix 查询一个不存在的列会得到全是 NaN。正如 @user2600939 提到的,你可以用 vardataframe.reset_index(inplace=True)(或者 vardataframe=vardataframe.reset_index())把 Symbol 重新放回作为一列。

撰写回答