#python #pandas #pandas-groupby
#python #pandas #pandas-groupby
Вопрос:
У меня есть фрейм данных (df) следующим образом:
cluster city category latitude longitude merchant
0 0 sanfran 10 39.072 -101.93253 merch2
1 0 sanfran 10 45.072 -110.93253 merch10
2 1 wichita 22 20.072 -100.93253 merch3
3 3 wichita 5 34.072 -99.93253 merch3
4 2 denver 1 40.072 -101.93253 merch1
5 1 longmont 4 30.072 -111.93253 merch2
6 1 longmont 4 30.072 -111.93253 merch2
7 3 topeka 5 20.072 -109.93253 merch1
И я хочу добраться до этого фрейма данных ‘dfout’
cluster merchant latitude longitude city category
0 0 merch10 45.072 -110.93253 sanfran 10
1 0 merch2 39.072 -101.93253 sanfran 10
2 1 merch2 30.072 -111.93253 longmont 4
3 1 merch3 20.070 -100.93253 wichita 22
4 2 merch1 40.072 -101.93253 denver 1
5 3 merch1 20.072 -109.93253 topeka 5
6 3 merch3 34.072 -99.93253 wichita 5
По сути, я хочу сгруппироваться по кластеру и продавцу внутри этих кластеров и подсчитать количество строк, которые есть у каждой комбинации кластеров-продавцов, и отсортировать их по самым высоким и самым низким значениям, т.Е. Продавец, у которого наибольшее количество строк в определенном кластере, находится сверху, а остальные торговцы следуют за ними в зависимости от их строкиподсчитывается.
Я могу выполнить следующее, используя оператор grouby, однако вот где я застрял.
df.groupby(['cluster','merchant']).count().sort_values(by='city',ascending=False)
city category latitude longitude
cluster merchant
1 merch2 2 2 2 2
0 merch10 1 1 1 1
merch2 1 1 1 1
1 merch3 1 1 1 1
2 merch1 1 1 1 1
3 merch1 1 1 1 1
merch3 1 1 1 1
Может кто-нибудь пролить свет на эту проблему, пожалуйста? как я могу перейти от df к dfout?
Спасибо
Ответ №1:
Это даст вам желаемый результат:
- Вам нужно использовать
.agg
с вашей.groupby
и использоватьfirst()
функцию для всех столбцов, кроме одного, где вам нужно взятьcount
(для целей сортировки позже. Я использовалcluster
столбец). - Поскольку я
cluster
дважды использовал столбец в.groupby
, мне также пришлось переименовать его раньше.reset_index()
, иначе возникла бы ошибка, связанная с наличием двух столбцов с одинаковым именем при сбросе индекса и приведенииcluster
в столбцы фрейма данных. - Сортировка по критериям
cluster
иcluster_count
и передачаascending=[True,False]
, чтобы вы могли сортировать по возрастанию для первого и по убыванию для последнего. Наконец, удалитеcluster_count
столбец.
df_out = df.copy()
df_out = (df_out.groupby(['cluster', 'merchant']).agg({'latitude' : 'first',
'longitude' : 'first',
'city' : 'first',
'category' : 'first',
'cluster' : 'count'})
.rename({'cluster' : 'cluster_count'},axis=1).reset_index()
.sort_values(['cluster', 'cluster_count'], ascending = [True, False])
.drop('cluster_count', axis=1))
df_out
Out[1]:
cluster merchant latitude longitude city category
0 0 merch10 45.072 -110.93253 sanfran 10
1 0 merch2 39.072 -101.93253 sanfran 10
2 1 merch2 30.072 -111.93253 longmont 4
3 1 merch3 20.072 -100.93253 wichita 22
4 2 merch1 40.072 -101.93253 denver 1
5 3 merch1 20.072 -109.93253 topeka 5