Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用比argsort更快的方式在数据帧子集中排序_Python_Pandas_Sorting - Fatal编程技术网

Python 使用比argsort更快的方式在数据帧子集中排序

Python 使用比argsort更快的方式在数据帧子集中排序,python,pandas,sorting,Python,Pandas,Sorting,我有这个数据框: user1 user2 quantity -------------------------- Alice Carol 10 Alice Bob 5 Bob Dan 2 Carol Eve 7 Carol Dan 100 我想使用数量按降序排列每一行,但按用户1排列。例如: user1 user2 quantity order -------------------

我有这个数据框:

user1    user2   quantity
--------------------------
Alice    Carol     10
Alice    Bob       5
Bob      Dan       2
Carol    Eve       7
Carol    Dan      100
我想使用数量按降序排列每一行,但按用户1排列。例如:

user1    user2   quantity   order
----------------------------------
Alice    Carol     10       1
Alice    Bob       5        2
Bob      Dan       2        1
Carol    Eve       7        2
Carol    Dan      100       1
目前,我的代码如下所示:

users = df['user1'].unique()
for user in users:
    cond = (df['user1'] == user)
    sort_ser = df[cond]['quantity'].values.argsort()[::-1] # descending
    df.loc[cond, 'order'] = sort_ser + 1
它适用于小数据帧。但如果是大型的,速度会很慢。我认为这是因为(1)我基本上是按用户运行它,(2)有几种情况正在发生。有没有更快的方法可以做到这一点?

使用:

df['order'] = df.groupby('user1')['quantity'].rank(ascending=False).astype(int)
输出:

   user1  user2  quantity  order
0  Alice  Carol        10      1
1  Alice    Bob         5      2
2    Bob    Dan         2      1
3  Carol    Eve         7      2
4  Carol    Dan       100      1
0    1.0
1    2.0
2    1.0
3    2.0
4    1.0
Name: quantity, dtype: float64
细节

df.groupby('user1')['quantity'].rank(ascending=False)
输出:

   user1  user2  quantity  order
0  Alice  Carol        10      1
1  Alice    Bob         5      2
2    Bob    Dan         2      1
3  Carol    Eve         7      2
4  Carol    Dan       100      1
0    1.0
1    2.0
2    1.0
3    2.0
4    1.0
Name: quantity, dtype: float64
带着一些裸体

a = np.lexsort([-df.quantity, df.user1])
u, idx, inv = np.unique(df.user1, return_index=True, return_inverse=True)

df.assign(order=a - idx.repeat(np.bincount(inv)) + 1)

   user1  user2  quantity  order
0  Alice  Carol        10      1
1  Alice    Bob         5      2
2    Bob    Dan         2      1
3  Carol    Eve         7      2
4  Carol    Dan       100      1

回答很好-值得检查一下
rank
中的平局机制在默认情况下是什么(平均值),以防这不是所需的。实际上,我现在正在我拥有的数据集上运行代码。早些时候,我想我已经做了100多分钟了,但我仍然没有完成。我会发布修改后的代码会发生什么,但我很乐观。