Панды Присвоение серии, отфильтрованной с помощью notnull () - PullRequest
0 голосов
/ 30 мая 2018

Здравствуйте, разработчики,

В настоящее время я изучаю панды и все еще пытаюсь обдумать, как присваивать значения, которые я преобразовал, например, в определенный тип, обратно в исходный фрейм данных.

Более конкретно, у меня есть этот фрейм данных:

     id         A       B
0   50000    12413     32885.0
1   50001     2040     43737.0
3   50002     2040     28015.0
4   50003     2040      NaN
5   50004     2040     28565.0

Моя цель - преобразовать столбец B в целые числа, но оставить значения NaN как есть, поэтому fillna(0) нет.Я хочу получить это:

     id         A       B
0   50000    12413     32885
1   50001     2040     43737
3   50002     2040     28015
4   50003     2040      NaN
5   50004     2040     28565

Я сделал это с print(df.loc[df['B'].notnull(), 'B'].astype('int')), и это сработало.

        B
0   32885
1   43737
3   28015
4   28565

Но если я попытаюсь присвоить его обратно фрейму данных с:

df.loc[df['B'].notnull(), 'B'] = df.loc[df['B'].notnull(), 'B'].astype('int')

Я все еще получаю исходные, не преобразованные данные.Так что я, кажется, делаю задание неправильно, но я не могу понять, как сделать это правильноПомощь будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

С пандами избегайте сочетания NaN с целыми числами

Если у вас нет веских причин, избегайте этой практики.Причина в том, что pandas допускает только векторизованные вычисления с массивами в смежных блоках памяти.Это возможно только для данных того же типа, например, серии типа int, float, datetime, но не object.

NaNсчитается float.Следовательно, объединение целых чисел с NaN заставляет pandas, чтобы по умолчанию вывести всю серию к значению float.Это увеличивает использование памяти, но в большинстве случаев это не проблема.

Если вы хотите объединить NaN с целыми числами, вам нужно создать серию с dtype=object и pandas работать ссерия указателей.Это дорого в вычислительном отношении и требует много памяти.Не делайте этого, если в этом нет необходимости.

Но если вы просто обязаны ...

Вы можете преобразовать серию в object перед преобразованием не- NaN элементы в целые числа:

df['B'] = df['B'].astype(object)

Как объяснено выше, вы просите pandas / numpy работать с указателем для каждого элемента в вашей серии.Вы могли бы также начать работать со списками.

0 голосов
/ 30 мая 2018

Поскольку type(np.nan) равно float, вам необходимо сначала преобразовать тип столбца.Например, вы можете сделать

df['B'] = df.B.astype(object)
df.loc[df['B'].notnull(), 'B'] = df.loc[df['B'].notnull(), 'B'].astype('int')

Обратите внимание, что это может оказать негативное влияние на использование памяти и производительность.

...