Панды получают подсчет со вспомогательной информацией

#python #pandas

#python #pandas

Вопрос:

У меня есть следующий фрейм данных:

 df = pd.DataFrame([{'file_name': 'my_movie.mov', 'status': 'final'}, {'file_name': 'his_movie.mov', 'status': 'source'}, {'file_name': 'her_movie.mov', 'status': 'source'}])

       file_name  status
0   my_movie.mov   final
1  his_movie.mov  source
2  her_movie.mov  source
  

Я хотел бы сделать что-то вроде:

 df.groupby('status')[['status', 'file_name', 'count']]
  

file_name может быть любым значением file_name, а count будет count количеством записей. Ответ был бы чем-то вроде:

 status         file_name              count
final          my_movie.mov           1
source         his_movie.mov          2
  

В SQL (с использованием диалекта mysql) Я бы сделал:

 SELECT status, file_name, COUNT(*) FROM df GROUP BY status
  

Как бы я это сделал в pandas?


Самое близкое, что я получил, это это, но это не добавляет в file_name, которое я хочу:

 >>> df[['new__status', 'file_name']].groupby('new__status').count().sort_values('file_name', ascending=False)
  

Комментарии:

1. Я не думаю, что ваш SQL-запрос правильный, вы группируете как по статусу, так и по имя_файла?

2. @Reza — нет. Я просто группируюсь status . Некоторые диалекты sql позволяют вам получать доступ к полям, которые не агрегируются, и просто извлекать оттуда случайное значение (иногда это называется ANY(...) или FIRST(...) .

3. Я вижу, так что вам нужно any в этом случае для Pandas?

4. @RezaI добавил обновление к вопросу с примером того, где я сейчас нахожусь.

5. Я только что опубликовал ответ, он работает для вас?

Ответ №1:

Попробуй это

 df.groupby('status').agg({'file_name': 'first', 'status': 'size'}).rename(columns={'status': 'count'}).reset_index()
  

Комментарии:

1. да, я только что добавил .sort_values('count', ascending=False) в конце, и это работает, спасибо! Но здесь два вопроса: (1) Почему вы добавили reset_index() в конце? Какой в этом смысл? (2) Не могли бы вы просто добавить пару ссылок на методы, которые вы используете? rename , agg и т.д. ?

2. reset_index() используется для приведения агрегированного столбца 'status' в качестве нового столбца вместо индекса. Вот ссылка для agg : pandas.pydata.org/pandas-docs/stable/reference/api /…

Ответ №2:

Использовать series.groupby NamedAgg

 df_agg = df.groupby('status').file_name.agg(file_name='first', count='count').reset_index()

Out[393]:
   status      file_name  count
0   final   my_movie.mov      1
1  source  his_movie.mov      2