Это на самом деле де-агрегация, потому что у меня есть набор данные структурированы таким образом:панда: Совокупная на основе даты начала/конца
id type first_year last_year
A t1 2009 2014
A t1 2010 2015
B t1 2007 2009
B t2 2008 2011
Но мне нужно агрегировать по ид/году и имеет перекрывающееся начало/конец записей.
данных в кадре панд данных, например так:
test_frame = pd.DataFrame([['A','t1',2009,2014],
['A','t1',2010,2015],
['B','t1',2007,2009],
['B','t2',2008,2011]],
columns = ['id','type','first_year','last_year'])
Я надеюсь получить данные, возвращаемые несколько различных способов:
id year count
A 2009 1
A 2010 2
A 2011 2
...
B 2007 1
B 2008 2
B 2009 1
И, возможно, как это:
id year type count
A 2009 t1 1
A 2010 t1 2
A 2011 t1 2
...
B 2007 t1 1
B 2008 t1 1
B 2008 t2 1
B 2009 t2 1
B 2010 t2 1
Это в основном работает для 1-го метода, но, как вы можете себе представить, он довольно медленно использует itertuples для больших данных задавать. Какой-нибудь пандасический путь?
out_frame = pd.DataFrame(columns = ['id','type','year'])
for rows in test_frame.itertuples():
for year in range(int(rows[3]),int(rows[4])):
d2 = pd.DataFrame({'id': [rows[1]],'year': [year]},columns = ['id','year'])
out_frame = out_frame.append(d2)
output1 = out_frame.groupby(['id','year'])['year'].count()
output1
хорошее решение! – MaxU