У меня высокий кадр данных панд, который называется 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)
Это кажется мне ужасно неэффективным. Что является более эффективным способом определения дат, когда каждый идентификатор имеет данные?
Спасибо большое!
Использование 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
df.eq(0).any(1)
, я получаю ответ в виде двух столбцов, первый из которых представляет собой столбец всех моих идентификаторов, а второй - столбец всех значений True ... Чего мне не хватает? Спасибо за ваше понимание!
Найдите уникальные идентификаторы в день, затем проверьте, все ли они.
gp = df.groupby('Date').ID.nunique()
gp[gp == df.ID.nunique()].index.tolist()
#['1-1-01', '1-3-01']
1-1-01
и разные 5000 на 1-2-01
но оба 1-1-01
и 1-2-01
будут отображаться, потому что они имеют одинаковые количество уникальных идентификаторов? Я неправильно это понимаю?
df.ID.nunique()
который является общим количеством уникальных идентификаторов во всем DataFrame
. Таким образом, если 1-1-01
имеет 5000 уникальных идентификаторов, а 1-2-01
имеет 5000 разных уникальных идентификаторов, df.ID.nunique()
будет равен 10000 (в нашем примере всего 2 дня), и поэтому оба не пройдут маску ,