Сгруппируйте 3 столбца и оставьте наименьшее 5 для каждой группы - PullRequest
2 голосов
/ 19 октября 2019

Прежде всего, извините, я не англичанин, но я надеюсь, вы все равно поймете мой вопрос; -)

У меня есть список с данными провайдера кабельной сети. работать с.

Я собрал эту информацию на

traffic.groupby(["HUB","FIBER_NODES","WEEK"])

Это работало нормально, я получаю всю информацию для каждой группы HUB-NODES-WEEK. Но сейчас я хочу проверить развитие трафика. Для этого я хочу получить разницу между средним значением за первые и последние 5 недель в этом фрейме данных.

Для этого я не хочу сохранять календарные недели от 1 до 38. Я просто хочу оставить от 1 до 5 или от 34 до 38.

Я пытался:

traffic.groupby(["HUB","FIBER_NODES","WEEK"]).nlargest(5)

ошибка: AttributeError: Невозможно получить доступ к вызываемому атрибуту «младший» из объектов «DataFrameGroupBy», попробуйте использовать метод «apply»

Следующая попытка:

traffic.groupby(["HUB","FIBER_NODES","WEEK"]).apply(lambda grp: grp.nlargest(5,"WEEK"))

Это не сработало, у меня все недели было от 1 до 38.

У кого-нибудь есть идеи, что я мог бы попробовать дальше? ; -)

Большое спасибо

Марко

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я думаю, что @ jon-clements в комментариях имеет правильную идею. Проблема в том, что вы включили "WEEK" в группу. Удаление его работает для меня (на разных данных):

traffic.groupby(["HUB","FIBER_NODES"]).apply(lambda grp: grp.nlargest(5,"WEEK"))

(я бы также ожидал, что nlargest будет работать, но, по-видимому, он не был реализован для DataFrame groupbys.: - /)

0 голосов
/ 20 октября 2019

Спасибо за ваши ответы.

Я нашел решение, которое работает очень хорошо:

start_df = traffic.loc[(traffic["WEEK"] < min_week) & (traffic["STREAM_TYPE"] == str_type)].groupby(["HUB","FIBER_NODES"]).median()[["AVG_ACTIVE_CMS","AvgVal"]].reset_index()

Желаю вам хорошего начала новой недели. Marco

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...