Питон Панды групповой сортировки - PullRequest
0 голосов
/ 08 октября 2018

Я хотел бы отсортировать следующий набор данных в порядке убывания (от наибольшего к наименьшему) в зависимости от того, является ли значение total_sales положительным или отрицательным для каждого состояния.Например, для АК, общий объем продаж является положительным для всех 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 голосов
/ 08 октября 2018

Сначала нам нужно получить значение сортировки, используя 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       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...