Эффективное пересечение сгруппированных столбов панд

1

У меня высокий кадр данных панд, который называется use with columns ID, Date,... Каждая строка уникальна, но каждый идентификатор имеет много строк, с одним идентификатором строки на дату.

ID    Date    Other_data
1     1-1-01  10
2     1-1-01  23
3     1-1-01  0
1     1-2-01  11
3     1-2-01  1
1     1-3-01  9
2     1-3-01  20
3     1-3-01  2

У меня также есть список уникальных идентификаторов, ids=use['ID'].drop_duplicates

Я хочу найти пересечение всех дат, то есть только даты, для которых каждый идентификатор имеет данные. Конечным результатом этой игрушечной проблемы должно быть [1-1-01, 1-3-01]

В настоящее время я просматриваю, подмножество по ID и пересечение. Грубо говоря, это выглядит так:

dates = use['Date'].drop_duplicates()
for i in ids:
    id_dates = use[(use['ID'] == i)]['Date'].values
    dates = set(dates).intersection(id_dates)

Это кажется мне ужасно неэффективным. Что является более эффективным способом определения дат, когда каждый идентификатор имеет данные?

Спасибо большое!

Теги:
pandas

2 ответа

2

Использование crosstab, когда значение равно 0, должно быть целевой строкой. используя df.eq(0).any(1). найти его

df=pd.crosstab(use.ID,use.Date)
df
Out[856]: 
Date  1-1-01  1-2-01  1-3-01
ID                          
1          1       1       1
2          1       0       1
3          1       1       1
  • 0
    Когда я использую df.eq(0).any(1) , я получаю ответ в виде двух столбцов, первый из которых представляет собой столбец всех моих идентификаторов, а второй - столбец всех значений True ... Чего мне не хватает? Спасибо за ваше понимание!
  • 0
    @namnnumbr тогда попробуй с любым (0)
1

Найдите уникальные идентификаторы в день, затем проверьте, все ли они.

gp = df.groupby('Date').ID.nunique()
gp[gp == df.ID.nunique()].index.tolist()

#['1-1-01', '1-3-01']
  • 0
    Не могли бы вы объяснить это немного больше? Кажется, что было бы возможно иметь 5000 уникальных идентификаторов на 1-1-01 и разные 5000 на 1-2-01 но оба 1-1-01 и 1-2-01 будут отображаться, потому что они имеют одинаковые количество уникальных идентификаторов? Я неправильно это понимаю?
  • 0
    @namnnumbr да немного. Потому что сравнение выполняется с df.ID.nunique() который является общим количеством уникальных идентификаторов во всем DataFrame . Таким образом, если 1-1-01 имеет 5000 уникальных идентификаторов, а 1-2-01 имеет 5000 разных уникальных идентификаторов, df.ID.nunique() будет равен 10000 (в нашем примере всего 2 дня), и поэтому оба не пройдут маску ,
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню