2016-08-04 5 views
0

У меня есть pd.DataFrame, который выглядит следующим образом:GroupBy с условиями в панд

In [30]: df 
Out[30]: 
     DATES UID  A 
0 2014-01-01 1 False 
1 2014-01-02 2 False 
2 2014-01-03 3 True 
3 2014-01-04 4 True 
4 2014-01-05 5 False 
5 2014-01-06 6 True 
6 2014-01-07 1 False 
7 2014-01-08 2 False 
8 2014-01-09 3 False 
9 2014-01-10 2 False 
10 2014-01-11 3 False 
11 2014-01-12 4 False 
12 2014-01-13 5 False 
13 2014-01-14 3 False 
14 2014-01-15 1 False 

и я хотел бы найти способ:

  1. Сортировать по СРОКИ ASC
  2. группы по UID
  3. Отфильтровать все UID, где первая запись (в UID) имеет «A» == False

Нужный результат будет выглядеть следующим образом:

In [30]: df 
Out[30]: 
    DATES UID  A 
0 2014-01-03 3 True 
1 2014-01-04 4 True 
2 2014-01-06 6 True 
3 2014-01-09 3 False 
4 2014-01-11 3 False 
5 2014-01-12 4 False 
6 2014-01-14 3 False 

Любые идеи очень ценится, спасибо!

+0

Вы можете показать свои усилия, например, вы пробовали [ 'groupby'] (http://pandas.pydata.org/pandas-docs /stable/groupby.html)? – EdChum

+0

Да, я пробовал с 'groupby' следующим образом: В [31]: df123 = df.sort_values ​​(by = 'DATES'). Groupby ('UID') В [32]: df123 Out [32 ]: и это объект, который создан, но не уверен, как отфильтровать правильные записи. – Thanos

+0

Пожалуйста, отредактируйте ваш вопрос своими попытками – EdChum

ответ

1

Похоже, необходимость первого sort_values, а затем filter:

df.sort_values(by='DATES', inplace=True) 
df = df.groupby('UID', sort=False).filter(lambda x: x.A.iloc[0] == True) 
print (df) 
     DATES UID  A 
2 2014-01-03 3 True 
3 2014-01-04 4 True 
5 2014-01-06 6 True 
8 2014-01-09 3 False 
10 2014-01-11 3 False 
11 2014-01-12 4 False 
13 2014-01-14 3 False 
+0

Было полезно посмотреть, как фильтровать первые значения для каждой группы, спасибо! – Thanos

+0

Благодарим вас за принятие! Приятный день! – jezrael

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