#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