<p>将<code>'day'</code>列设置为<a href="http://pandas.pydata.org/pandas-docs/stable/categorical.html" rel="nofollow noreferrer">categorical</a>数据类型,只需确保在设置类别时,天数列表按您希望的顺序排序。然后,执行<code>groupby</code>将自动为您排序,但如果您尝试对列进行排序,则它将按照指定的正确顺序进行排序。</p>
<pre><code># Initial setup.
np.random.seed([3,1415])
n = 100
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
df = pd.DataFrame({
'device_id': np.random.randint(1,3,n),
'day': np.random.choice(days, n),
'dwell_time':np.random.random(n)
})
# Set as category, groupby, and sort.
df['day'] = df['day'].astype("category", categories=days, ordered=True)
df = df.groupby(['device_id', 'day']).sum()
</code></pre>
<p><strong><em>更新</em></strong>:astype不再接受类别,使用:</p>
<pre><code>category_day = pd.api.types.CategoricalDtype(categories=days, ordered=True)
df['day'] = df['day'].astype(category_day)
</code></pre>
<p>结果输出:</p>
<pre><code> dwell_time
device_id day
1 Mon 4.428626
Tue 3.259319
Wed 2.436024
Thu 0.909724
Fri 4.974137
Sat 5.583778
Sun 2.687258
2 Mon 3.117923
Tue 2.427154
Wed 1.943927
Thu 4.599547
Fri 2.628887
Sat 6.247520
Sun 2.716886
</code></pre>
<p>请注意,此方法适用于任何类型的自定义排序。例如,如果有一个列的条目是<code>'a', 'b', 'c'</code>,并且希望它按非标准顺序排序,例如<code>'c', 'a', 'b'</code>,那么您只需执行相同类型的过程:将该列指定为categorical,而您的类别则按所需的非标准顺序。</p>