Pandas数据框可以按其列的值进行排序,但我想按照我不想添加到数据框的系列的值对数据框进行排序 - 尽管它具有相同的索引。
我通过将系列添加到数据框(作为列),排序并再次删除列来对数据框进行排序。示例代码nprojnpercent
是我的数据框,total
是我的系列:
nprojnpercent["total"]=total
nprojnpercent.sort_values(by="total",ascending=False,inplace=True)
nprojnpercent.pop("total")
它有效,但对我来说似乎很奇怪。是否有更简单的方法来按序列订购数据框?
答案 0 :(得分:1)
一种略有不同(可能可靠)的方法:
def sort_df(df, by, **kwargs):
if isinstance(by, str):
return df.sort_values(by)
by = pd.Series(by.reset_index(drop=True))
idx = by.sort_values(**kwargs).index
return df.iloc[idx]
现在,df的索引(可能是日期时间或其他)与by的索引不匹配无关紧要。您仍然可以按by的值进行排序。
答案 1 :(得分:0)
sort_values
返回已排序的系列,因此请获取此索引并将其命名为idx
。由于s
的索引与df
的索引相对应,因此您可以将loc
与idx
一起使用,然后根据`s的排序值重新排列行。
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
s = pd.Series(np.random.randn(5), name='C')
>>> df
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
2 0.950088 -0.151357 -0.103219
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
>>> s
0 0.333674
1 1.494079
2 -0.205158
3 0.313068
4 -0.854096
Name: C, dtype: float64
idx = s.sort_values().index
>>> df.loc[idx]
A B C
4 0.761038 0.121675 0.443863
2 0.950088 -0.151357 -0.103219
3 0.410599 0.144044 1.454274
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278