Как запустить групповую игру на основе результатов другой / предыдущей групповой игры? - PullRequest
0 голосов
/ 30 января 2019

Предположим, вы продаете продукт по всему миру и хотите открыть офис продаж в крупном городе.Ваше решение будет основываться исключительно на данных о продажах.

Это будут ваши (упрощенные) данные о продажах:

df={
'Product':'Chair',
'Country': ['USA','USA', 'China','China','China','China','India', 
'India','India','India','India','India', 'India'],
'Region': ['USA_West','USA_East', 'China_West','China_East','China_South','China_South', 'India_North','India_North', 'India_North','India_West','India_West','India_East','India_South'],
'City': ['A','B', 'C','D','E', 'F', 'G','H','I', 'J','K', 'L', 'M'],
'Sales':[1000,1000, 1200,200,200, 200,500 ,350,350,100,700,50,50]  
}

dff=pd.DataFrame.from_dict(df)

dff

На основе данных, которые вы должны указать для города "G".

Логика должна выглядеть следующим образом:

1) Найти страну с Максом (продажи)

2) в этой стране, найти регион с Максом (продажи)

3) в этом регионе найдите город с Максом (продажи)

Я пытался: groupby('Product', 'City').apply(lambda x: x.nlargest(1)), но это не сработало, потому что это предложило бы город "C".Это город с самыми высокими продажами в мире, но Китай не является страной с самыми высокими продажами.

Мне, вероятно, придется пройти через несколько циклов группового.На основе результата отфильтруйте исходный фрейм данных и снова выполните групповую работу на следующем уровне.

Чтобы добавить сложности, вы продаете и другие продукты (не только «Стулья», но и другую мебель).Вам нужно было бы где-то хранить результаты каждой итерации (например, страну с Макс. (Объем продаж) на продукт), а затем использовать ее на следующей итерации группы.

У вас есть идеи, как я могу реализоватьэто в пандах / питоне?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Один из способов - добавить итоги по группам, а затем отсортировать ваш фрейм данных.Это выходит за рамки ваших требований, упорядочивая все ваши данные, используя вашу логику предпочтений:

df = pd.DataFrame.from_dict(df)

factors = ['Country', 'Region', 'City']
for factor in factors:
    df[f'{factor}_Total'] = df.groupby(factor)['Sales'].transform('sum')

res = df.sort_values([f'{x}_Total' for x in factors], ascending=False)

print(res.head(5))

   City Country Product       Region  Sales  Country_Total  Region_Total  \
6     G   India   Chair  India_North    500           2100          1200   
7     H   India   Chair  India_North    350           2100          1200   
8     I   India   Chair  India_North    350           2100          1200   
10    K   India   Chair   India_West    700           2100           800   
9     J   India   Chair   India_West    100           2100           800   

    City_Total  
6          500  
7          350  
8          350  
10         700  
9          100  

Таким образом, для наиболее желательных вы можете использовать res.iloc[0], для второго res.iloc[1] и т. Д.

0 голосов
/ 30 января 2019

Идея - совокупность sum для каждого уровня с Series.idxmax для значения top1, что используется для фильтрации для следующего уровня по boolean indexing:

max_country = dff.groupby('Country')['Sales'].sum().idxmax()
max_region = dff[dff['Country'] == max_country].groupby('Region')['Sales'].sum().idxmax()
max_city = dff[dff['Region'] == max_region].groupby('City')['Sales'].sum().idxmax()
print (max_city)
G
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...