【问题标题】:Why does my multi-index dataframe have duplicate values for indices?为什么我的多索引数据框具有重复的索引值?
【发布时间】:2019-01-21 23:36:55
【问题描述】:

我有以下名为 df 的 pd.DataFrame:

                   date     cluster_label        value
0   2018-11-14 02:16:22                 0          1.5
1   2018-11-14 02:16:22                 0          7.0
2   2018-11-14 02:16:22                 0          2.5
3   2018-11-14 02:16:22                 1          3.0
4   2018-11-14 02:16:22                 1          0.5
5   2018-11-14 02:16:22                 2          1.0

在设置多级索引或数据框之前,我执行以下命令将日期列转换为只有月份和年份值:

self.df['date'] = self.df['date'].dt.to_period('M')
self.df.set_index(['cluster_label', 'date'], inplace=True)

现在,输出是这样的:

                           value
cluster_label date                                                                  
0              2018-11     1.5
               2018-11     7.0
               2018-11     2.5
1              2018-11     3.0
               2018-11     0.5
2              2018-11     1.0

但这是错误的。我希望输出没有日期列的重复索引。输出应如下所示:

                           value
cluster_label date                                                                  
0              2018-11     1.5
                           7.0
                           2.5
1              2018-11     3.0
                           0.5
2              2018-11     1.0

我做错了什么,如何更改我的代码以获得所需的输出?

【问题讨论】:

    标签: python pandas dataframe multi-level


    【解决方案1】:

    一种选择是附加cumcounted 级别:

    df.set_index(df.groupby(level=[0,1]).cumcount(), append=True)
    
                             value
    cluster_label date            
    0             2018-11 0    1.5
                          1    7.0
                          2    2.5
    1             2018-11 0    3.0
                          1    0.5
    2             2018-11 0    1.0
    

    在哪里,

    df.set_index(df.groupby(level=[0,1]).cumcount(), append=True).index 
    # MultiIndex(levels=[[0, 1, 2], [2018-11], [0, 1, 2]],
    #            labels=[[0, 0, 0, 1, 1, 2], [0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 0]],
    #            names=['cluster_label', 'date', None])
    

    另一种选择(我不建议这样做)是显式屏蔽这些值并重置索引。

    u = np.where(df.index.duplicated(), '', df.index.get_level_values(1))
    df.index = pd.MultiIndex.from_arrays([df.index.get_level_values(0), u])
    
    df
                           value
    cluster_label               
    0             2018-11    1.5
                             7.0
                             2.5
    1             2018-11    3.0
                             0.5
    2             2018-11    1.0
    

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 2021-03-22
      • 2015-10-04
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多