В принципе, дисперсия применяется, когда CLR может гарантировать, что ей не нужно делать какие-либо репрезентативные изменения к значениям. Все ссылки одинаковы, поэтому вы можете использовать IEnumerable
как IEnumerable
без каких-либо изменений в представлении; сам собственный код не обязательно должен знать, что вы делаете со значениями, если инфраструктура гарантировала, что он определенно будет действительным.
Для типов значений, которые не work - для обработки IEnumerable
как IEnumerable
, код, использующий последовательность, должен был бы знать, следует ли выполнять преобразование бокса или нет.
Возможно, вы захотите прочитать блог Эрика Липперта пост по представлению и идентичности для более подробной информации по этой теме в целом.
EDIT: перечитав блог в блоге Эрика, это как минимум примерно тождество как представление, хотя эти два связаны. В частности:
Вот почему ковариантные и контравариантные преобразования интерфейса и типов делегатов требуют, чтобы все переменные аргументы типа были ссылочными типами. Чтобы гарантировать, что вариантное преобразование ссылок всегда сохраняется с сохранением идентичности, все преобразования, связанные с аргументами типа, также должны сохраняться в идентичности. Самый простой способ гарантировать, что все нетривиальные преобразования в аргументах типа сохраняют сохранение идентичности, - это ограничение их ссылок на ссылки.
blockquote>
jezrael всегда быстрее, но я пытаюсь изучить панды здесь, поэтому вот моя попытка;)
Я использую метод передискретизации: вы хотите заполнить пробелы путем перестановки данных к интервалу годового запуска («AS»)
Сначала преобразуйте столбец «Год» в pandas datetime и установите его как index
df.Year = pd.to_datetime(df.Year, format="%Y")
df = df.set_index('Year')
. Затем я обрабатываю каждый уникальный идентификатор отдельно и создаю новый выход DataFrame
IDs = df.ID.unique()
newDf = pd.DataFrame()
Цикл обработки
for ID in IDs:
# resample to annual start (although end would also be OK)
temp = df[df.ID==ID].resample('AS').sum()
# fill in the blanks, now 0, with the wanted data
temp[temp.ID==0] = pd.DataFrame({'ID':ID, 'Data1':'', 'Data2':''},
index=temp[temp.ID==0].index)
# concat this new data with the output frame
newDf = pd.concat([newDf, temp])
Наконец, очистите вывод, удалив индекс и преобразовывая дату-время обратно в строку
newDf = newDf.reset_index()
newDf.Year = newDf.Year.dt.strftime('%Y')
Результат:
Year ID Data1 Data2
0 2010 345 3 2
1 2011 345 1 4
2 2012 345 5 2
3 2013 345 3 1
4 2014 345 3 1
5 2015 345 3 1
6 2016 345 3 1
7 2010 123 1 1
8 2011 123
9 2012 123 0 2
10 2013 123
11 2014 123
12 2015 123
13 2016 123 0 2