从现有数据框创建多索引

Create multiindex from existing dataframe

我现在花了几个小时到处浏览,试图从 pandas 中的数据框创建一个多索引。这是我的数据框(发布 excel sheet 模型。我在 pandas 数据框中有这个):

这就是我想要的:

我试过了

newmulti = currentDataFrame.set_index(['user_id','account_num'])

但它 returns 是一个数据框,而不是多索引。另外,我不知道如何使 'user_id' 级别 0 和 'account_num' 级别 1。我认为这一定是微不足道的,但我已经阅读了很多帖子、教程等,但仍然无法理解出来。部分原因是我是一个非常注重视觉的人,而大多数帖子都不是。请帮忙!

currentDataFrame.set_index(['user_id','account_num']) 编辑的 DataFrame return 的索引设置为 ['user_id','account_num']

newmulti.index 将 return MultiIndex 对象。

在这种情况下,您可以简单地使用 groupby,这将在对所请求列的销售额求和时自动创建多索引。

df.groupby(['user_id', 'account_num', 'dates']).sales.sum().to_frame()

您也应该能够简单地执行此操作:

df.set_index(['user_id', 'account_num', 'dates'])

尽管您可能希望通过对它们求和来避免任何重复(例如,具有相同 user_idaccount_numdate 值但不同销售数字的两行或更多行),这是为什么我推荐使用 groupby.

如果你需要多索引,你可以简单地访问 viat new_df.index 其中 new_df 是从上面两个操作中的任何一个创建的新数据帧。

并且user_id将是级别0并且account_num将是级别1。

使用pd.MultiIndex.from_arrays

lvl0 = currentDataFrame.user_id.values
lvl1 = currentDataFrame.account_num.values

midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1'])

为了澄清未来的用户,我想添加以下内容:

正如亚历山大所说,

df.set_index(['user_id', 'account_num', 'dates'])

可能 inplace=True 可以完成这项工作。

type(df)给出

pandas.core.frame.DataFrame

type(df.index) 确实是预期的

pandas.core.indexes.multi.MultiIndex

有两种方法可以做到这一点,尽管与您展示的不完全一样,但它确实有效。
假设您有以下 df:

      A   B    C      D
0   nil one    1    NaN
1   bar one    5    5.0
2   foo two    3    8.0
3   bar three  2    1.0
4   foo two    4    2.0
5   bar two    6    NaN

1.解决方法 1:

df.set_index('A', append = True, drop = False).reorder_levels(order = [1,0]).sort_index()

这将 return:

2。解决方法 2:

df.set_index(['A', 'B']).sort_index()

这将 return: