排序熊猫系列

时间:2012-08-26 19:10:01

标签: python pandas sorting series

我试图弄清楚如何以智能方式对由于聚合聚合而生成的系列进行排序。

我生成了一个像我这样的DataFrame聚合:

means = df.testColumn.groupby(df.testCategory).mean()

这导致系列赛。我现在尝试按值排序,但得到一个错误:

means.sort()
...
-> Exception: This Series is a view of some other array, to sort in-place you must create a copy

然后我尝试创建副本:

meansCopy = Series(means)
meansCopy.sort()
-> Exception: This Series is a view of some other array, to sort in-place you must create a copy

我怎样才能使这种方式有效?

2 个答案:

答案 0 :(得分:28)

Pandas v0.17 +

使用sort_values,即means = means.sort_values()

原始答案,前v0.17

尝试使用order,即means = means.order()

答案 1 :(得分:2)

  

v0.23 +答案:ordersortsortUpsortDown等已被弃用。

相反,还有其他一些更恰当地命名的函数可用于pandas DataFrames和Series。 Series.sort_values是一种这样的方法。

# Setup.
np.random.seed(0)
df = pd.DataFrame({'A': list('aaabbbbccddd'), 'B': np.random.choice(5, 12)})
ser = df.groupby('A')['B'].mean()
ser

A
a    2.333333
b    2.500000
c    3.000000
d    1.333333
Name: B, dtype: float64

ser.sort_values()

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

如果您需要按降序排序,请指定ascending=False作为文档状态:

ser.sort_values(ascending=False)

A
c    3.000000
b    2.500000
a    2.333333
d    1.333333
Name: B, dtype: float64

您还可以调用Series.argsort并用__getitem__ / Series.iloc重新编制索引:

ser[ser.argsort()]

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

ser.iloc[ser.argsort()]

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

您可以使用numpy.argsort做同样的事情(应该快一点):

ser[np.argsort(ser)]
# ser[np.argsort(ser.values)]

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

如果您需要按降序排序,请先取反ser

ser[(-ser).argsort()]

A
c    3.000000
b    2.500000
a    2.333333
d    1.333333
Name: B, dtype: float64

对于其他类似方法,该过程相同。


最后,如果您只关心值(而不关心索引),请使用np.sort

np.sort(ser)
# array([1.33333333, 2.33333333, 2.5       , 3.        ])

请注意,可以就地排序,但不建议这样做:

ser.values.sort()

将就地对系列值进行排序,但不会修改索引,因此从技术上讲是不正确的。