【问题标题】:How do I rearrange/reorder (not necessarily sort) a pandas dataframe index?如何重新排列/重新排序(不一定排序)熊猫数据框索引?
【发布时间】:2017-12-16 00:12:43
【问题描述】:

如何重新排列/重新排序(不一定是排序)pandas 数据框索引?

我有以下数据框:

df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7],
                   'B': [0, 1, 0, 2, 1, 7, 1]},
                  index=['Sat', 'Tue', 'Sun', 'Fri',
                         'Wed', 'Mon', 'Thu'])

给出:

     A  B
Sat  1  0
Tue  2  1
Sun  3  0
Fri  4  2
Wed  5  1
Mon  6  7
Thu  7  1

我想按星期几(即周日、周一、周二、周三、周四、周五、周六)对索引进行排序。具有重新排列/重新排序索引的数据框应如下所示:

     A  B
Sun  3  0
Mon  6  7
Tue  2  1
Wed  5  1
Thu  7  1
Fri  4  2

但是使用 df.sort_index() 会产生一个按字母顺序排序的 df 索引。

如何明确指定数据帧索引的顺序?

我能想到的解决方案是在数据框创建期间将所需的索引排序作为列表传递:

df = pd.DataFrame(df, index=['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri'])

在不创建另一个数据框的情况下,还有什么方法可以做到这一点?

谢谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用loc 并按照您想要的顺序给它一个索引列表:

    df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7],
                       'B': [0, 1, 0, 2, 1, 7, 1]},
                      index=['Sat', 'Tue', 'Sun', 'Fri',
                             'Wed', 'Mon', 'Thu'])
    df = df.loc[['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], :]
    df
    #      A  B
    # Sun  3  0
    # Mon  6  7
    # Tue  2  1
    # Wed  5  1
    # Thu  7  1
    # Fri  4  2
    # Sat  1  0
    

    【讨论】:

    • @ralphqq 这就是你想要的吗?
    【解决方案2】:

    我自己一直在为此苦苦挣扎,当您使用 MultiIndex Julien 的建议时,它变得有点不切实际。但是,一旦习惯了,解决方案就相对简单:只需使用新索引重新索引数据帧。在你的情况下,这真的很容易:

    days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri']
    df2 = df.reindex(days)
    df2
         A  B
    Sun  3  0
    Mon  6  7
    Tue  2  1
    Wed  5  1
    Thu  7  1
    Fri  4  2
    

    请注意,您不能就地执行此操作。

    但可能值得注意的是,您可能必须创建索引——您当然需要为数据框创建多个索引。所以准备好使用pd.Index()pd.MultiIndex()正确创建索引

    当与df.swaplevel() 结合使用时,这将为您提供极大的灵活性。

    【讨论】:

    • reindex() 有一个 level= 参数,可用于指定我们希望在 MultiIndex 场景中应用重新索引的位置
    【解决方案3】:

    您只需在第一列的数据框中添加“星期”作为寄存器。

    # ascending
    df.sort_values('week')
    # reverse ascending
    df.sort_values('week', ascending=False)
    

    或者这点可能更简单:

    df.sort_index(inplace=True)
    print(df.to_string())
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多