按照一系列数据对Pandas数据框进行排序

5
Pandas数据帧可以按其列的值进行排序,但我想通过一个不想添加到数据帧中的系列的值来对数据帧进行排序 - 尽管它具有相同的索引。 我通过将该系列添加到数据帧中(作为一列),进行排序并再次删除该列来对数据帧进行了排序。在示例代码中,nprojnpercent是我的数据帧,total是我的系列。
nprojnpercent["total"]=total
nprojnpercent.sort_values(by="total",ascending=False,inplace=True)
nprojnpercent.pop("total")

这个方法是可行的,但对我来说有些奇怪。是否有更简单的方法可以按系列排序数据帧?

2个回答

5

sort_values函数返回已排序的序列,因此需要获取其索引并将其命名为idx。由于s的索引对应于df的索引,因此可以使用locidx来根据`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

3

稍微不同(可能更加健壮)的方法:


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的值进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接