提问人:Prmake 提问时间:10/26/2023 更新时间:10/26/2023 访问量:115
在 pandas 数据帧中对集群子集群中的行进行排序
Sort rows in sub cluster of cluster in pandas dataframe
问:
我有一个数据帧,如下所示:
Part Date Quantity
A 2023-10-26 -1
A 2023-10-26 1
A 2023-11-03 1
A 2023-12-15 -1
B 2023-11-09 2
B 2023-11-14 -2
B 2023-11-14 2
B 2023-11-19 2
每个部件都是一个聚类,部件中的每个日期都是一个子聚类。我想根据以下条件对每个部件的每个日期的数量值进行排序:首先是正值。结果应为:
Part Date Quantity
A 2023-10-26 1
A 2023-10-26 -1
A 2023-11-03 1
A 2023-12-15 -1
B 2023-11-09 2
B 2023-11-14 2
B 2023-11-14 -2
B 2023-11-19 2
可以使用某种双分组,还是应该寻找不同的解决方案?
答:
4赞
jezrael
10/26/2023
#1
在DataFrame.sort_values
中使用参数,并通过Series.lt
或 Series.le
进行比较来指定正值的列:key
Quantity
False
out = df.sort_values(['Part', 'Date', 'Quantity'],
key=lambda x: x.le(0) if x.name=='Quantity' else x)
print (out)
Part Date Quantity
1 A 2023-10-26 1
0 A 2023-10-26 -1
2 A 2023-11-03 1
3 A 2023-12-15 -1
4 B 2023-11-09 2
6 B 2023-11-14 2
5 B 2023-11-14 -2
7 B 2023-11-19 2
评论
1赞
Prmake
10/26/2023
效果很好。在一个拥有超过 10k 个独特部分的大型数据帧上,大约有 100 个被随机排列。对我来说不是问题,它很好地粘在零件和日期集群上。
6赞
PaulS
10/26/2023
#2
另一种可能的解决方案,它使用布尔列表来定义几个排序顺序:
df.sort_values(['Part', 'Date', 'Quantity'], ascending=[True, True, False])
输出:
Part Date Quantity
1 A 2023-10-26 1
0 A 2023-10-26 -1
2 A 2023-11-03 1
3 A 2023-12-15 -1
4 B 2023-11-09 2
6 B 2023-11-14 2
5 B 2023-11-14 -2
7 B 2023-11-19 2
评论
1赞
Corralien
10/26/2023
一个合乎逻辑的答案!
2赞
mozway
10/26/2023
#3
如果你想对所有值进行排序,那么numpy.lexsort
是相当有效的:
out = df.iloc[np.lexsort([df['Quantity']<0, df['Date'], df['Part']])]
如果你真的想对组中的值进行排序,而不是修改组,那么你需要一个groupby.apply
:
out = (df.groupby(['Part', 'Date'], group_keys=False)
.apply(lambda g: g.sort_values(by='Quantity', key=lambda x: x<0))
)
输出:
Part Date Quantity
1 A 2023-10-26 1
0 A 2023-10-26 -1
2 A 2023-11-03 1
3 A 2023-12-15 -1
4 B 2023-11-09 2
6 B 2023-11-14 2
5 B 2023-11-14 -2
7 B 2023-11-19 2
评论
0赞
Prmake
10/26/2023
从本质上讲,它可以工作,但在大型数据帧上非常慢。
0赞
mozway
10/26/2023
@Prmake哪一个?麻木的方法应该是快速的,确实很慢,但能够将组保持在适当的位置。如果需要后一点,我可以提供更快的变体。groupby
1赞
Prmake
10/26/2023
groupby确实很慢。Lexsort 选项在重新排序我的数据框中的数量列时没有成功。@jezrael的解决方案对我来说效果很好。
0赞
mozway
10/26/2023
@Prmake我很惊讶 lexsort 不起作用。你用过我写的吗?你能举一个反例吗?
评论