在pandas中对簇的子簇中的行进行排序

pkbketx9  于 2023-11-15  发布在  其他
关注(0)|答案(3)|浏览(126)

我有一个框架如下:

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


可以使用某种双groupby,或者我应该寻找不同的解决方案?

nbnkbykc

nbnkbykc1#

另一种可能的解决方案,它使用布尔列表来定义几个排序顺序:

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

qacovj5a

qacovj5a2#

DataFrame.sort_values中使用key参数,通过Series.ltSeries.le比较,为False指定列Quantity,以获得正值:

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

字符串

cclgggtu

cclgggtu3#

如果你想对所有值进行排序,那么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

相关问题