【问题标题】: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。我认为这一定是微不足道的,但我已经阅读了很多帖子、教程等,但仍然无法弄清楚。部分原因是我是一个非常有眼光的人,而大多数帖子都不是。请帮忙!

【问题讨论】:

  • 出于处理目的,两个表是相同的。但出于展示的目的,我建议你参考:stackoverflow.com/a/25127764/2306662
  • 但我认为如果我想绘制(所有帐户的)总销售额与日期之间的关系,我需要多索引?
  • @puifais 为什么你不能绘制你已经放在一起的第二个数据框?

标签: python pandas dataframe multi-index reindex


【解决方案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_idaccount_numdate 值但不同的销售数字),这就是我建议使用groupby 的原因。

        如果您需要多索引,您可以简单地通过new_df.index 访问,其中new_df 是从上述两个操作中的任何一个创建的新数据帧。

        user_id 将是 0 级,account_num 将是 1 级。

        【讨论】:

        • 这意味着,按 user_id、account_num 和日期分组并提取销售数据。如果销售数据恰好具有相同的 user_id、account_num 和日期,则将它们相加。对吗?
        • Sort of... 这意味着您正在通过sum 汇总销售数据。如果该列不是数字,您将无法对其求和。您必须将 firstlastunique 与 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 的新手。
        • 你的最终目标是什么?如果您想要具有多索引的原始数据框,那么您已经有了。
        猜你喜欢
        • 1970-01-01
        • 2016-01-13
        • 2023-03-23
        • 2014-02-10
        • 2017-05-01
        • 2019-08-11
        • 2021-05-07
        • 2020-02-22
        相关资源
        最近更新 更多