从现有数据框创建多索引

Posted

技术标签:

【中文标题】从现有数据框创建多索引【英文标题】:Create multiindex from existing dataframe 【发布时间】:2017-11-10 14:07:26 【问题描述】:

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

这就是我想要的:

我试过了

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

但它返回一个数据帧,而不是多索引。另外,我不知道如何使“user_id”级别为 0 和“account_num”级别为 1。我认为这一定是微不足道的,但我已经阅读了很多帖子、教程等,但仍然无法弄清楚。部分原因是我是一个非常有眼光的人,而大多数帖子都不是。请帮忙!

【问题讨论】:

出于处理目的,两个表是相同的。但出于展示的目的,我建议你参考:***.com/a/25127764/2306662 但我认为如果我想绘制(所有帐户的)总销售额与日期之间的关系,我需要多索引? @puifais 为什么你不能绘制你已经放在一起的第二个数据框? 【参考方案1】:

有两种方法可以做到这一点,虽然不完全像你展示的那样,但它确实有效。 假设您有以下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()

这将返回:

2。解决方法 2:

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

这将返回:

【讨论】:

【参考方案2】:

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

正如亚历山大所说,

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

使用可能的inplace=True 来完成这项工作。

type(df) 给了

pandas.core.frame.DataFrame

type(df.index) 确实是预期

pandas.core.indexes.multi.MultiIndex

【讨论】:

【参考方案3】:

使用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'])

【讨论】:

【参考方案4】:

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

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

您也应该能够简单地这样做:

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

虽然您可能希望通过求和来避免任何重复(例如,两行或多行具有相同的user_idaccount_numdate 值但不同的销售数字),这就是我建议使用groupby 的原因。

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

user_id 将是 0 级,account_num 将是 1 级。

【讨论】:

这意味着,按 user_id、account_num 和日期分组并提取销售数据。如果销售数据恰好具有相同的 user_id、account_num 和日期,则将它们相加。对吗? Sort of... 这意味着您正在通过sum 汇总销售数据。如果该列不是数字,您将无法对其求和。您必须将 firstlastunique 与 lambda 函数一起使用。 如果我有更多的列,而不是销售?【参考方案5】:

currentDataFrame.set_index(['user_id','account_num']) 返回的 DataFrame 的索引设置为 ['user_id','account_num']

newmulti.index 将返回 MultiIndex 对象。

【讨论】:

嗯...我不明白。我是先做newmulti = currentDataFrame.set_index(['user_id','account_num']),然后再做newmultiReal = newmulti.index?你能澄清一下吗?我是 pandas 的新手。 你的最终目标是什么?如果您想要具有多索引的原始数据框,那么您已经有了。

以上是关于从现有数据框创建多索引的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 多索引数据框创建等高线图

如何为多索引数据框创建图

从数据集列表制作多索引数据框[重复]

为多索引 Panda 数据框创建基于另一列的新列

使用具有多索引的数据框创建条形图

从隐藏在多索引中的年月创建日期时间