从现有数据框创建多索引
Create multiindex from existing dataframe
我现在花了几个小时到处浏览,试图从 pandas 中的数据框创建一个多索引。这是我的数据框(发布 excel sheet 模型。我在 pandas 数据框中有这个):
这就是我想要的:
我试过了
newmulti = currentDataFrame.set_index(['user_id','account_num'])
但它 returns 是一个数据框,而不是多索引。另外,我不知道如何使 'user_id' 级别 0 和 'account_num' 级别 1。我认为这一定是微不足道的,但我已经阅读了很多帖子、教程等,但仍然无法理解出来。部分原因是我是一个非常注重视觉的人,而大多数帖子都不是。请帮忙!
由 currentDataFrame.set_index(['user_id','account_num'])
编辑的 DataFrame return 的索引设置为 ['user_id','account_num']
newmulti.index
将 return MultiIndex 对象。
在这种情况下,您可以简单地使用 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。
lvl0 = currentDataFrame.user_id.values
lvl1 = currentDataFrame.account_num.values
midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1'])
为了澄清未来的用户,我想添加以下内容:
正如亚历山大所说,
df.set_index(['user_id', 'account_num', 'dates'])
可能 inplace=True
可以完成这项工作。
type(df)
给出
pandas.core.frame.DataFrame
而 type(df.index)
确实是预期的
pandas.core.indexes.multi.MultiIndex
有两种方法可以做到这一点,尽管与您展示的不完全一样,但它确实有效。
假设您有以下 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()
这将 return:
2。解决方法 2:
df.set_index(['A', 'B']).sort_index()
这将 return:
我现在花了几个小时到处浏览,试图从 pandas 中的数据框创建一个多索引。这是我的数据框(发布 excel sheet 模型。我在 pandas 数据框中有这个):
这就是我想要的:
我试过了
newmulti = currentDataFrame.set_index(['user_id','account_num'])
但它 returns 是一个数据框,而不是多索引。另外,我不知道如何使 'user_id' 级别 0 和 'account_num' 级别 1。我认为这一定是微不足道的,但我已经阅读了很多帖子、教程等,但仍然无法理解出来。部分原因是我是一个非常注重视觉的人,而大多数帖子都不是。请帮忙!
由 currentDataFrame.set_index(['user_id','account_num'])
编辑的 DataFrame return 的索引设置为 ['user_id','account_num']
newmulti.index
将 return MultiIndex 对象。
在这种情况下,您可以简单地使用 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。
lvl0 = currentDataFrame.user_id.values
lvl1 = currentDataFrame.account_num.values
midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1'])
为了澄清未来的用户,我想添加以下内容:
正如亚历山大所说,
df.set_index(['user_id', 'account_num', 'dates'])
可能 inplace=True
可以完成这项工作。
type(df)
给出
pandas.core.frame.DataFrame
而 type(df.index)
确实是预期的
pandas.core.indexes.multi.MultiIndex
有两种方法可以做到这一点,尽管与您展示的不完全一样,但它确实有效。
假设您有以下 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()
这将 return:
2。解决方法 2:
df.set_index(['A', 'B']).sort_index()
这将 return: