Панды - Как сгруппировать и удалить определенные строки - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть DF, подобный этому:

id     company     duration
0    Other Company    5
0    Other Company    19
0    X Company        7
1    Other Company    24
1    Other Company    6
1    X Company        12
2    X Company        9
3    Other Company    30
3    X Company        16

Мне нужно сгруппировать DF по идентификатору и компании, а затем суммировать продолжительность каждого из них.В конце мне нужны только значения с «X Company».Вот что я сделал:

import pandas as pd
jobs = pd.read_csv("data/jobs.csv")
time_in_company = jobs.groupby(['id','company'])['duration'].agg(sum)

И получил это:

id     company     duration
0    Other Company    24
0    X Company        7
1    Other Company    30
1    X Company        12
2    X Company        9
3    Other Company    30
3    X Company        16

Теперь мне нужно удалить все записи из «Другой компании».Уже пытался использовать time_in_company.drop ('Любая компания') #Return KeyError 'Любая компания'

Попытка .set_index ('компания'), чтобы попробовать что-то еще, но он говорит мне объект 'Series'не имеет атрибута 'set_index'

Пытался использовать .filter () в группе, но мне нужен .agg (сумма).(И все равно это не сработало ..

Может кто-нибудь пролить свет на этот вопрос для меня? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Сначала используйте pd.query () для удаления строк 'X Company', чем groupby оставшиеся df, например:

import numpy as np
import pandas as pd


ids = [0,0,0,1,1,1,2,3,3]
company = ['Other Company','Other Company','X Company','Other Company','Other Company','X Company','X Company','Other Company','X Company']
duration = [5,19,7,24,6,12,9,30,16]

df = pd.DataFrame({'ids':ids,'company':company,'duration':duration})


df.query("company=='Other Company'").groupby(['ids','company'])['duration'].agg(sum)

Вы получаете:

ids  company      
0    Other Company    24
1    Other Company    30
3    Other Company    30
Name: duration, dtype: int64

РЕДАКТИРОВАТЬ: Кроме того, вы можете использовать комбинацию pd.where () , dropna () и pd.pivot_table () с:

df.where(df['company']=='Other Company').dropna().pivot_table(['duration'],index=['ids','company'],aggfunc='sum')

Вы получаете:

duration
ids company                
0.0 Other Company      24.0
1.0 Other Company      30.0
3.0 Other Company      30.0

Тем не менее, первое происходит быстрее:
2,03 мс ± 62,3 мкс на цикл (среднее± стандартное отклонение из 7 циклов, по 100 циклов в каждом)
5,87 мс ± 23,4 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов в каждом)

0 голосов
/ 23 ноября 2018

Помогает ли это?

time_in_company= time_in_company.reset_index(level='company')
time_in_company [time_in_company ['company']!="Other Company"] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...