从现有数据框创建多重索引。

31

我已经花了数小时在各处浏览,试图从pandas中的数据框创建多索引。这是我拥有的数据框(发布Excel表格模拟。我确实在pandas数据框中拥有此数据):

have

这就是我想要的:

want

我已经尝试过

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

但它返回的是数据框,而不是多级索引。此外,我无法弄清楚如何将'user_id'设置为0级,'account_num'设置为1级。我认为这应该很简单,但我已经阅读了很多帖子、教程等,仍然无法弄清楚。部分原因是因为我是一个非常视觉化的人,而大多数帖子都不是。请帮帮我!


为了处理目的,这两个表是相同的。但是为了显示目的,我建议您参考:stackoverflow.com/a/25127764/2306662 - nikpod
但是我认为如果我想绘制所有账户的总销售额与日期之间的关系,我需要使用多重索引? - puifais
@puifais 为什么你无法绘制你组合的第二个数据框呢? - Andrew L
5个回答

36

在这种情况下,您可以简单地使用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和dates进行分组,并提取销售数据。如果销售数据恰好具有相同的user_id、account_num和dates,则将它们求和。对吗? - puifais
1
有点像是...这意味着您正在通过“sum”聚合销售数据。如果该列不是数字,则无法对其进行求和。您将不得不使用类似于firstlast或带有lambda函数的unique之类的东西。 - Alexander
如果我有除销售之外的更多列呢? - Shravya Boggarapu

7
为了让未来的用户更加明确,我想补充以下内容:
正如亚历山大所说,
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'])

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

这将返回:

enter image description here

2. 解决方法 2:

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

这将返回:
enter image description here


1

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

newmulti.index将返回MultiIndex对象。


1
嗯...我不理解。那我是要执行 newmulti = currentDataFrame.set_index(['user_id','account_num']) 然后 newmultiReal = newmulti.index 吗?你能否澄清一下呢?我对 Pandas 完全是新手。 - puifais
你的最终目标是什么?如果你想要带有多级索引的原始数据框,那么你已经拥有它了。 - user2047399

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接