在 pandas 数据帧中对集群子集群中的行进行排序

Sort rows in sub cluster of cluster in pandas dataframe

提问人:Prmake 提问时间:10/26/2023 更新时间:10/26/2023 访问量:115

问:

我有一个数据帧,如下所示:

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

可以使用某种双分组,还是应该寻找不同的解决方案?

Python Pandas Group-by

评论


答:

4赞 jezrael 10/26/2023 #1

DataFrame.sort_values中使用参数,并通过Series.ltSeries.le 进行比较来指定正值的列:keyQuantityFalse

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 不起作用。你用过我写的吗?你能举一个反例吗?