我现在花了几个小时到处浏览,尝试从pandas中的数据框架创建多索引。这是我的数据框(发布excel表样机。我在pandas数据帧中有这个):
这就是我想要的:
我试过了
newmulti = currentDataFrame.set_index(['user_id','account_num'])
但它返回一个数据帧,而不是多索引。此外,我无法弄清楚如何使'user_id'级别0和'account_num'级别1.我认为这必须是微不足道的,但我已经阅读了很多帖子,教程等,但仍然无法弄明白。部分是因为我是一个非常直观的人,大多数帖子都没有。请帮忙!
答案 0 :(得分: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
。
如果您需要多索引,只需访问viat new_df.index
,其中new_df
是从上述两个操作中的任何一个创建的新数据框。
user_id
为0级,account_num
为1级。
答案 1 :(得分:2)
lvl0 = currentDataFrame.user_id.values
lvl1 = currentDataFrame.account_num.values
midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1'])
答案 2 :(得分: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()
答案 3 :(得分:0)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first">some text</div>
<div class ="second">bunch of text</div>
返回的DataFrame将其索引设置为currentDataFrame.set_index(['user_id','account_num'])
['user_id','account_num']
将返回MultiIndex对象。
答案 4 :(得分:0)
为了澄清将来的用户,我想添加以下内容:
如亚历山大所说,
df.set_index(['user_id', 'account_num', 'dates'])
加上可能的inplace=True
即可完成工作。
type(df)
给予
pandas.core.frame.DataFrame
type(df.index)
确实是预期的
pandas.core.indexes.multi.MultiIndex