python pandas groupby排序

时间:2018-10-08 01:42:16

标签: python pandas sorting pandas-groupby

我想根据每个州的“ total_sales”是正数还是负数,以降序(最大到最小)对以下数据集进行排序。例如,对于AK,所有4个地区的总销售额均为正。因此,区域将按照降序从所有正区域的最大销售额开始排序,然后再降序移至负区域。对于NC,这将是相反的,因为NC的“ total_sales”净值为负。

此外,如果可能的话,为了表示表示“ total_sales”趋势的第一个区域/最大区域,我想创建一个列,该列表示与整体“每个州的total_sales趋势。

State   Region   Sales    Total_sales    
AK      North    10       20
AK      South    25       20 
AK      East     -30      20
AK      West     15       20
NC      North    20       -35
NC      South    -50      -35
NC      East     -20      -35 
NC      West     15       -35

所需的输出

State   Region   Sales    Total_sales    Note
AK      South     25        20
AK      West      15        20 
AK      North     10        20
AK      East      -30       20           offset
NC      South     -50       -35
NC      East      -20       -35
NC      North     20        -35          offset
NC      West      15        -35

谢谢!您可以提供的任何帮助/指导都将不胜感激!

1 个答案:

答案 0 :(得分:2)

首先,我们需要使用np.sign创建排序键

来获取排序值
df['sign']=np.sign(df.Total_sales)
df['sign']=df.sign*np.sign(df.Sales)
df['sign2']=df.Sales.abs()
df=df.sort_values(['State','sign','sign2'],ascending=[True,False,False])

然后我们获得偏移位置

df['SaleSign']=np.sign(df.Sales)
df['note']=df.groupby('State').SaleSign.diff().fillna(0).ne(0).map({True:'offset',False:''})
df
Out[427]: 
  State Region  Sales  Total_sales  sign  SaleSign    note
1    AK  South     25           20     1         1        
3    AK   West     15           20     1         1        
0    AK  North     10           20     1         1        
2    AK   East    -30           20    -1        -1  offset
6    NC   East    -20          -35     1        -1        
5    NC  South    -50          -35     1        -1        
4    NC  North     20          -35    -1         1  offset
7    NC   West     15          -35    -1         1