Панды - цикл через групповой df и фильтр по пересечению - PullRequest
0 голосов
/ 29 июня 2018

У меня проблемы с объединением следующих шагов в Пандах: у меня есть моментальные снимки по двум объектам. Я нашел пересечение объектов между двумя объектами для каждой даты, и эти объекты хранятся в списке списков (один подсписок для каждой даты).

Теперь я хотел бы отфильтровать исходные кадры данных каждого объекта, чтобы учитывать только пересечения, поэтому я пытаюсь использовать логическое индексирование для фильтрации, в то же время используя групповую обработку. Ниже приведен цикл, который я пытаюсь построить:

filtered_df=pd.DataFrame()
for date_sublist in range(len(intersect_list):
    overlap_temp=df_orig[df_orig['ObjectName'].filter(intersect_list[date_sublist])]
    bkln_overlap.append(overlap_temp)

Я также попробовал приведенную ниже конструкцию в качестве теста, где я пытался сохранить только те строки, в которых имя объекта соответствовало конкретному списку пересечений:

df_orig[df_orig['ObjectName'] in intersect_list[1]]

У кого-нибудь есть совет по этой проблеме? Спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Без примеров данных из OP, я буду использовать простой пример для демонстрации. Я надеюсь, что это то, что вам нужно, или, по крайней мере, можете немного изменить его, чтобы добиться того, чего вы хотите.

После прочтения вашего OP (вместе с вашими комментариями), я думаю, вы должны хранить списки пересечений в словаре, например:

intersections = {'01/01/2018': ['ObjectA','ObjectC'], '01/02/2018': ['ObjectA','ObjectD'], etc.....}

Для этого:

df = pd.DataFrame([['01/01/2018', 'ObjectA', 0, 0, 0, 1],['01/01/2018', 'ObjectE', 0, 1, 1, 1],['01/02/2018', 'ObjectB', 0, 0, 0, 0],
                ['01/04/2018', 'ObjectD', 0, 1, 1, 0],['01/02/2018', 'ObjectE', 1, 1, 0, 1],['01/03/2018', 'ObjectB', 0, 0, 0, 0],
                ['01/01/2018', 'ObjectC', 0, 1, 1, 0],['01/03/2018', 'ObjectA', 1, 1, 0, 1],['01/04/2018', 'ObjectD', 0, 0, 0, 0]],
                columns=['Date','Object','x1','x2','x3','x4'])

         Date   Object  x1  x2  x3  x4
0  01/01/2018  ObjectA   0   0   0   1
1  01/01/2018  ObjectE   0   1   1   1
2  01/02/2018  ObjectB   0   0   0   0
3  01/04/2018  ObjectD   0   1   1   0
4  01/02/2018  ObjectE   1   1   0   1
5  01/03/2018  ObjectB   0   0   0   0
6  01/01/2018  ObjectC   0   1   1   0
7  01/03/2018  ObjectA   1   1   0   1
8  01/04/2018  ObjectD   0   0   0   0

Группировка по 'Date':

grouped = df.groupby('Date')
intersections = {key: list(set(grouped.get_group(key)['Object'])) for key, val in grouped}

Дает:

{'01/01/2018': ['ObjectE', 'ObjectA', 'ObjectC'], '01/02/2018': ['ObjectE', 'ObjectB'], '01/03/2018': ['ObjectA', 'ObjectB'], '01/04/2018': ['ObjectD']}

Затем примените фильтры из словаря пересечений:

out = [df[(df['Date']==key) & (df['Object'].isin(val))] for key, val in intersections.items()]

Дает:

         Date   Object  x1  x2  x3  x4
0  01/01/2018  ObjectA   0   0   0   1
1  01/01/2018  ObjectE   0   1   1   1
6  01/01/2018  ObjectC   0   1   1   0
         Date   Object  x1  x2  x3  x4
2  01/02/2018  ObjectB   0   0   0   0
4  01/02/2018  ObjectE   1   1   0   1
         Date   Object  x1  x2  x3  x4
5  01/03/2018  ObjectB   0   0   0   0
7  01/03/2018  ObjectA   1   1   0   1
         Date   Object  x1  x2  x3  x4
3  01/04/2018  ObjectD   0   1   1   0
8  01/04/2018  ObjectD   0   0   0   0
...