2015-10-02 2 views
2

Я имею dataframe, который содержит следующие данные:Удалить строки, на основе даты сравнения

Estimate  Value  Announce date  Period  Company 
Estimate 1: 0,24  01-01-2015   31-12-2015  X 
Estimate 2: 0,22  08-04-2015   31-12-2015  X 
Estimate 3 0,26  07-05-2015   31-12-2014  Y 
Estimate 4: 0,29  21-09-2015   31-12-2014  Y 
Estimate 5: 0,21  30-09-2015   31-12-2013  Z 

Я хотел бы включать только оценку в ранниеза период и за компании.

Пример: Компания x имеет за период 31-12-2015 две оценки, 1 и 2, но оценка 1 имеет более раннюю дату объявления, чем оценка 2. Поэтому я хотел бы удалить строку для оценки 2, а затем это для каждого периода и компании.

Дата объявления и период как в формате datetime.

Что такое правильный способ для этого?

Спасибо!

+0

моя первая догадка заключалась бы в том, чтобы создать словарь с ключом по периоду, а затем установить набор для дат анонса и отсортировать его на основе этого и взять только первый элемент – SirParselot

+0

Можете ли вы привести мне пример этого? – F1990

+0

или более простой способ сделать это, если периоды сгруппированы, - это просто установить первую в качестве самой ранней даты, проверить следующую, если раньше, чем удалить предыдущий набор, и удалить предыдущий, а затем удалить новый. – SirParselot

ответ

1

IIUC, то вы можете просто позвонить first на GroupBy объекта:

In [191]: 
df.groupby(['Period','Company']).first() 

Out[191]: 
         Estimate Value AnnounceDate 
Period  Company        
2013-12-31 Z  Estimate5: 0,21 2015-09-30 
2014-12-31 Y  Estimate3: 0,26 2015-07-05 
2015-12-31 X  Estimate1: 0,24 2015-01-01 

Если вы хотите отсортированные результаты затем отсортировать ФР до начала groupby:

In [194]: 
df.sort(columns='AnnounceDate').groupby(['Period','Company']).first() 

Out[194]: 
         Estimate Value AnnounceDate 
Period  Company        
2013-12-31 Z  Estimate5: 0,21 2015-09-30 
2014-12-31 Y  Estimate3: 0,26 2015-07-05 
2015-12-31 X  Estimate1: 0,24 2015-01-01 
+1

Это действительно приятнее, если вы сначала вызываете сортировку для безопасности – ryanmc

+0

Я не был уверен, нужен ли OP первый по дате или оценка – EdChum

+0

Спасибо! И как я могу указать, что он должен сортировать по объявлению, если у меня больше столбцов в моем фреймворке? (Чтобы узнать что-то дополнительное из этого вопроса;) – F1990

1

Одним из способов было бы сгруппировать данные по периодам затем ранга, а затем подмножестве Rank = 1:

from io import StringIO 
import pandas as pd 

s = u"""Estimate Value AnnounceDate Period Company 
Estimate1: 0,24 01-01-2015 31-12-2015 X 
Estimate2: 0,22 08-04-2015 31-12-2015 X 
Estimate3: 0,26 07-05-2015 31-12-2014 Y 
Estimate4: 0,29 21-09-2015 31-12-2014 Y 
Estimate5: 0,21 30-09-2015 31-12-2013 Z""" 

df = pd.read_csv(StringIO(s), delimiter=" ") 
df['Rank'] = df.groupby(['Period','Company'])['AnnounceDate'].rank(ascending=True) 
df[df['Rank']==1] 
+0

спасибо за ваш пример, но как я могу включить в него компании? Смотрите мой отредактированный пост. – F1990

+0

Вы можете передать несколько полей методу groupby (отредактировано) – ryanmc

Смежные вопросы