Вы можете использовать pandas.DataFrame.fillna
с опцией method='ffill'
. 'ffill'
означает «прямое заполнение» и будет распространять последнее действительное наблюдение вперед. Альтернативой является 'bfill'
, который работает одинаково, но обратный.
import pandas as pd
df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df = df.fillna(method='ffill')
print(df)
# 0 1 2
#0 1 2 3
#1 4 2 3
#2 4 2 9
Для этого также существует функция прямого синонима, pandas.DataFrame.ffill
, чтобы сделать вещи проще .
Тип void
не имеет размера; это будет ошибка компиляции. По той же причине вы не можете сделать что-то вроде:
void n;
EDIT. К моему удивлению, выполнение sizeof(void)
на самом деле делает компиляцию в GNU C:
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc -w - && ./a.out
1
Однако в C ++ это не:
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc++ -w - && ./a.out
<stdin>: In function 'int main()':
<stdin>:1: error: invalid application of 'sizeof' to a void type
<stdin>:1: error: 'printf' was not declared in this scope
sizeof()
не может применяться к неполным типам. И void
является неполным типом, который не может быть завершен.
В C, sizeof(void) == 1
в GCC, но это зависит от вашего компилятора.
В C ++ я получаю:
In function 'int main()': Line 2: error: invalid application of 'sizeof' to a void type compilation terminated due to -Wfatal-errors.
Если вы используете GCC, и вы не используете флагов компиляции, которые удаляют специфические расширения для компилятора, тогда sizeof(void)
равно 1. GCC имеет нестандартное расширение , которое делает это.
В общем случае void
является неполным типом, и вы не можете использовать sizeof для неполных типов.
-Wpointer-arith
подразумевается -pedantic
. Я всегда использовал -pedantic
. :)
– Josh Lee
3 November 2009 в 13:13
void
не имеет размера. В C и C ++ выражение sizeof (void)
недействительно.
В C, цитируя N1570 6.5.3.4, пункт 1:
Оператор
blockquote>sizeof
не должен применяться к выражению, имеющему тип функции или неполному типу , к имени в скобках такого типа или выражению, которое обозначает член битового поля.(N1570 - проект стандарта ISO C 2011 года.)
void
является неполным типом. Этот абзац является ограничением , что означает, что любой соответствующий C-компилятор должен диагностировать любое его нарушение. (Диагностическое сообщение может быть предупреждением, не несущественным.)Стандарт C ++ 11 имеет очень похожую формулировку. Оба выпуска были опубликованы после того, как этот вопрос был задан, но правила восходят к стандарту ANSI C 1989 года и самым ранним стандартам C ++. На самом деле правило, что
void
является неполным типом, к которомуsizeof
не может применяться, возвращается точно так же, как введениеvoid
в язык.gcc имеет extension , который рассматривает
sizeof (void)
как 1. gcc по умолчанию не является совместимым компилятором C, поэтому в режиме по умолчанию он не предупреждает оsizeof (void)
. Расширения, подобные этому, разрешены даже для полностью совместимых компиляторов C, но диагностика по-прежнему требуется.
sizeof(void) == 1
для согласованности с арифметикой указателя на указателе void
, что также является расширением gcc . Ссылаясь на их документацию: A consequence of this is that sizeof is also allowed on void and on function types, and returns 1.
. Но все же диагностическое сообщение должно присутствовать по умолчанию для C, как это требует Стандарт.
– Grzegorz Szpetkowski
21 February 2015 в 12:51
-std=c11 -pedantic
. С такими параметрами он выдает необходимую диагностику.
– Keith Thompson
7 September 2017 в 23:59
Хотя void
может стоять на месте для типа, он фактически не может удерживать значение. Поэтому он не имеет размера в памяти. Получение размера void
не определено.
Указатель void
- это просто языковая конструкция, означающая указатель на память untyped .
Большинство компиляторов C ++ выбрали для повышения компиляции при попытке получить sizeof(void)
.
При компиляции C gcc не соответствует и решил определить sizeof(void)
как 1. Это может показаться странным, но имеет логическое обоснование. Когда вы выполняете арифметику указателя, добавляя или удаляя одну единицу, это означает добавление или удаление объекта, указывающего на размер. Таким образом, определение sizeof(void)
как 1 помогает определить void*
как указатель на байт (нетипизированный адрес памяти). В противном случае у вас было бы удивительное поведение, используя арифметику указателя, такую как p+1 == p when
p void*
. Такая арифметика указателя на указателях void не допускается в c ++, но отлично работает при компиляции C с gcc.
. Рекомендуемым стандартным способом было бы использовать char*
для этой цели (указатель на байт).
Еще одно подобное различие между C и C ++ при использовании sizeof возникает, когда вы определили пустую структуру типа:
struct Empty {
} empty;
Использование gcc в качестве моего компилятора C sizeof(empty)
возвращает 0. Используя g ++ тот же код вернет 1.
Я не уверен, что называет состояние как стандартов C, так и C ++ в этой точке, но я считаю, что определение размера некоторых пустых структур / объектов помогает в управлении ссылками, чтобы избежать этих двух ссылки на разные последовательные объекты, первый из которых пуст, получает тот же адрес. Если ссылка реализована с использованием скрытых указателей, как это часто делается, обеспечение того, что другой адрес поможет их сравнить.
Но это просто избегает неожиданного поведения (сравнение ссылок на столбик) путем введения другого (пустые объекты, даже POD потребляют не менее 1 байт памяти).
sizeof(void)
не определен в C, как в C ++. GCC просто не соответствует в этой точке, а указательная арифметика на указателях void
просто не определена - void* p; p++;
является недопустимым. Даже GCC даст вам предупреждение при компиляции с флагом -pedantic
. И вы также ошибаетесь в отношении поведения GCC по умолчанию для C ++: по умолчанию это рассматривается как ошибка i>.
– Konrad Rudolph
21 March 2013 в 11:37
struct
определением является синтаксическая ошибка; Поддержка gcc - это расширение. Они могут быть действительными в C ++; Я не уверен.
– Keith Thompson
1 February 2015 в 04:20
Во вторую часть вопроса: Обратите внимание, что sizeof (void *)! = sizeof (void). В 32-битной дуге sizeof (void *) составляет 4 байта, поэтому p ++ будет установлен соответствующим образом. Величина, на которую увеличивается указатель, зависит от данных, на которые он указывает. Таким образом, он будет увеличен на 1 байт.
T*
увеличивается на sizeof(T)
(и not i> sizeof(T*)
, что почти всегда будет одинаковым, кроме возможно i> для указателей функций), когда оно увеличивается. Исключением является, конечно, void
(и снова исключение - это когда включены расширения GCC).
– Konrad Rudolph
3 November 2009 в 18:48
void*
указывает на 1 байт? sizeof (void)
является нарушением ограничения. (Расширение gcc рассматривает его как 1.)
– Keith Thompson
1 February 2015 в 04:09
, в то время как sizeof (void), возможно, не имеет смысла сам по себе, важно, когда вы делаете какую-либо математику указателя.
например.
void *p;
while(...)
p++;
Если sizeof (void ) считается 1, тогда это сработает. Если sizeof (void) считается 0, вы попадаете в бесконечный цикл.
unsigned char*
.
– Keith Thompson
1 February 2015 в 04:07
sizeof (void)
является нарушением ограничения. Соответствующий компилятор C (который gcc не по умолчанию) должен, по крайней мере, предупреждать об этом, и может (и IMHO) отклонить его. Ссылка: N1570 6.5.3.4p1 (void
является неполным типом). Так было со стандартом 1989 года, который ввелvoid
. – Keith Thompson 1 February 2015 в 04:06void
не существовало до того, как оно было введено стандартом ANSI C 1989 года, тем же стандартом, который сделалsizeof (void)
нарушение ограничения. – Keith Thompson 1 February 2015 в 04:06