从现有数据框创建多索引
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_id
、account_num
和date
值但不同的销售数字),这就是我建议使用groupby
的原因。
如果您需要多索引,您可以简单地通过new_df.index
访问,其中new_df
是从上述两个操作中的任何一个创建的新数据帧。
user_id
将是 0 级,account_num
将是 1 级。
【讨论】:
这意味着,按 user_id、account_num 和日期分组并提取销售数据。如果销售数据恰好具有相同的 user_id、account_num 和日期,则将它们相加。对吗? Sort of... 这意味着您正在通过sum
汇总销售数据。如果该列不是数字,您将无法对其求和。您必须将 first
、last
或 unique
与 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 的新手。
你的最终目标是什么?如果您想要具有多索引的原始数据框,那么您已经有了。以上是关于从现有数据框创建多索引的主要内容,如果未能解决你的问题,请参考以下文章