我有一个熊猫数据框,其中的“用户”列包含分类值(a,b,c,d)。我只关心两个类别的升序排列(a,d)。所以(a,b,c,d)和(a,c,b,d)对我都很好。
问题的第一部分是如何创建订单?
第二,我还有另一列包含“时间戳记”。我想先按“时间戳”对行进行排序,然后再对具有相同时间戳的行按上述分类值排序进行排序。
可以说我的数据框看起来像这样。
+-----------+------+
| Timestamp | User |
+-----------+------+
| 1 | b |
| 2 | d |
| 1 | a |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
+-----------+------+
我首先希望这种排序发生
+-----------+------+
| Timestamp | User |
+-----------+------+
| 1 | b |
| 1 | a |
| 1 | c |
| 1 | d |
| 2 | d |
| 2 | a |
| 2 | b |
+-----------+------+
接着是“用户”的绝对顺序
+-----------+------+
| Timestamp | User |
+-----------+------+
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | d |
+-----------+------+
OR
+-----------+------+
| Timestamp | User |
+-----------+------+
| 1 | a |
| 1 | c |
| 1 | b |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | d |
+-----------+------+
如您所见,“ c”和“ b”的顺序无关紧要。
答案 0 :(得分:1)
您可以通过categories
来按排序类别指定顺序,然后调用DataFrame.sort_values
:
df['User'] = pd.Categorical(df['User'], ordered=True, categories=['a','b','c','d'])
df = df.sort_values(['Timestamp','User'])
print (df)
Timestamp User
2 1 a
0 1 b
3 1 c
4 1 d
5 2 a
6 2 b
1 2 d
如果User
的值很多,则可以动态创建类别:
vals = ['a', 'd']
cats = vals + np.setdiff1d(df['User'], vals).tolist()
print (cats)
['a', 'd', 'b', 'c']
df['User'] = pd.Categorical(df['User'], ordered=True, categories=cats)
df = df.sort_values(['Timestamp','User'])
print (df)
Timestamp User
2 1 a
4 1 d
0 1 b
3 1 c
5 2 a
1 2 d
6 2 b