我试图弄清楚如何以智能方式对由于聚合聚合而生成的系列进行排序。
我生成了一个像我这样的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
我怎样才能使这种方式有效?
答案 0 :(得分:28)
使用sort_values
,即means = means.sort_values()
。
尝试使用order
,即means = means.order()
。
答案 1 :(得分:2)
v0.23 +答案:
order
,sort
,sortUp
,sortDown
等已被弃用。
相反,还有其他一些更恰当地命名的函数可用于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()
将就地对系列值进行排序,但不会修改索引,因此从技术上讲是不正确的。