Я ищу способ добавить пустые строки в фрейм данных, если выполняются два условия. Условия заключаются в том, что если идентификатор индекса не найден в конкретном году, код добавит пустую строку с идентификатором индекса и годом, но другие столбцы будут пустыми. Конечная цель - создать идеальный набор панельных данных, где каждое наблюдение представлено 7 раз (в зависимости от года), хотя могут быть данные из некоторых наблюдений, например. 1 или 3 раза (это не постоянно, но время от времени меняется). В противном случае эти отсутствующие строки данных были бы пустыми, за исключением индекса «ID» и года.
Вот пример того, как сейчас выглядит мой фрейм данных all_data:
ID Year Data1 Data2
345 2010 3 2
345 2011 1 4
345 2012 5 2
345 2013 3 1
345 2014 3 1
345 2015 3 1
345 2016 3 1
123 2010 1 1
123 2012 0 2
123 2016 0 2
Вот пример того, что я ищу.
ID Year Data1 Data2
345 2010 3 2
345 2011 1 4
345 2012 5 2
345 2013 3 1
345 2014 3 1
345 2015 3 1
345 2016 3 1
123 2010 1 1
123 2011
123 2012 0 2
123 2013
123 2014
123 2015
123 2016 0 2
У меня более 200 наблюдений и 20 столбцов данных, поэтому выполнение этого вручную занимает слишком много времени. Это то, что я пробовал, но это не работает. Он возвращает тот же фрейм данных и не добавляет пустых строк. «Отсутствующие» - это список, содержащий все уникальные идентификаторы, которые можно найти во фрейме данных all_data.
missing = ['345', '123']
sub_dfs = []
for year in [ 2010, 2011, 2012, 2013, 2014, 2015, 2016 ]:
sub_df = all_data.loc[ all_data[ 'Year' ] == year ].copy()
if( year == 2010):
sub_df.set_index( 'ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
if (year == 2011):
sub_df.set_index('ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
if (year == 2012):
sub_df.set_index('ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
if (year == 2013):
sub_df.set_index('ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
if (year == 2014):
sub_df.set_index('ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
if (year == 2015):
sub_df.set_index('ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
if (year == 2016):
sub_df.set_index('ID', inplace=True)
sub_df.reindex(sub_df.index.union(missing))
sub_dfs.append(sub_df)
new_data = pd.concat(sub_dfs)
Заранее спасибо за вашу помощь!