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

时间:2017-12-16 00:12:44

标签: python pandas dataframe

如何重新排列/重新排序(不一定排序)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'])

在不创建其他数据框的情况下,另一种方法是什么?

谢谢。

3 个答案:

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

答案 1 :(得分:0)

您只需要添加“周”。在第一列的dataFrame中注册。

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

或许这一点可能更容易:

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

答案 2 :(得分:0)

我自己为此一直在挣扎,当您使用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()结合使用时,可以为您带来极大的灵活性。