создание серии panda на основе сумм столбцов данных - PullRequest
0 голосов
/ 10 октября 2019

С учетом этого кадра данных:

df
       animal location  number
0       lions     zoo1      10
1      tigers     zoo2     200
2       bears     zoo2     300
3        ohmy     zoo2     400
4   antelopes     zoo1      20
5  orangutans     zoo2     500
6      zebras     zoo1      30

Мне нужно найти трех лучших животных по зоопарку, суммировать их независимо от типа животных и затем определить, в каком зоопарке больше всего животных. Я дошел до того, что я могу выбирать и группировать по местоположению и животному, я думаю, что сейчас мне нужно создать серию с местоположением в качестве ключа и суммой каждого местоположения в качестве значения, но язастрял. (Если это не лучший способ приблизиться к этому, я открыт для предложений.)

df.set_index(['location','number'], inplace=True)
df.groupby(level=[0,1]).sum().reset_index().sort_values(['location', 'number'], ascending=[1,0]).groupby('location').head(3)
  location  number      animal
2     zoo1      30      zebras
1     zoo1      20   antelopes
0     zoo1      10       lions
6     zoo2     500  orangutans
5     zoo2     400        ohmy
4     zoo2     300       bears

(Кажется, sum() ничего не делает в этом контексте, но я должен иметьчто-то для groupby(), и я не знаю, есть ли что-нибудь лучше.) Я ищу здесь:

zoo2   1200
zoo1   60

Код для создания исходного df:

df = pd.DataFrame({'animal': ['lions', 'tigers', 'bears', 'ohmy', 'antelopes', 'orangutans','zebras'],
    'location': ['zoo1', 'zoo2', 'zoo2', 'zoo2', 'zoo1', 'zoo2', 'zoo1'],
    'number': [10, 200, 300, 400, 20, 500, 30]})

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Это можно сделать с помощью groupby:

df.groupby('location')['number'].sum()

вернет это как вывод:

location
zoo1      60
zoo2    1200
Name: number, dtype: int64
0 голосов
/ 10 октября 2019

используя ваш начальный фрейм данных:

df
       animal location  number
0       lions     zoo1      10
1      tigers     zoo2     200
2       bears     zoo2     300
3        ohmy     zoo2     400
4   antelopes     zoo1      20
5  orangutans     zoo2     500
6      zebras     zoo1      30

Использовать groupby :

df.groupby('location')['number'].apply(lambda x: x.sort_values(ascending=False).head(3).sum())

Выход:

location
zoo1      60
zoo2    1200
Name: number, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...