首先通过时间戳值对熊猫中的行进行排序,然后对列的类别值进行特定排序

时间:2019-02-11 09:20:10

标签: python-3.x pandas

我有一个熊猫数据框,其中的“用户”列包含分类值(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”的顺序无关紧要。

1 个答案:

答案 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