从现有数据框

时间:2017-06-08 18:12:57

标签: python pandas dataframe multi-index reindex

我现在花了几个小时到处浏览,尝试从pandas中的数据框架创建多索引。这是我的数据框(发布excel表样机。我在pandas数据帧中有这个):

have

这就是我想要的:

want

我试过了

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

但它返回一个数据帧,而不是多索引。此外,我无法弄清楚如何使'user_id'级别0和'account_num'级别1.我认为这必须是微不足道的,但我已经阅读了很多帖子,教程等,但仍然无法弄明白。部分是因为我是一个非常直观的人,大多数帖子都没有。请帮忙!

5 个答案:

答案 0 :(得分: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

如果您需要多索引,只需访问viat new_df.index,其中new_df是从上述两个操作中的任何一个创建的新数据框。

user_id为0级,account_num为1级。

答案 1 :(得分:2)

使用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 :(得分: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()

这将返回:

enter image description here

2.解决方法 2:

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

这将返回:
enter image description here

答案 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