Python dataframe.at присваивание с изменением типа данных - PullRequest
0 голосов
/ 06 сентября 2018

Пожалуйста, посмотрите код и вывод.

Могу ли я узнать, почему тип данных в столбце * _state имеет тип float, а не int, и как преобразовать этот тип данных в int?

Спасибо

Код

print(df_test)
for idx, row in df_test.iterrows():
    print(type(row['value']))
    df_test.at[idx, row['name'] + '_state'] = row['value']
print(df_test)

выход

        Message   name  value
0  Door_Started   Door      1
1    Light_open  Light      1

type 'int'
type 'int'

        Message   name  value  Door_state  Light_state
0  Door_Started   Door      1         1.0          NaN
1    Light_open  Light      1         NaN          1.0

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы назначаете целое число только одному столбцу row['name'] + '_state'. Это приводит к тому, что для любого заданного индекса значения NaN появляются в других столбцах.

NaN считается float ( см. Здесь, почему ), поэтому смесь значений int и NaN всегда будет повышаться до float 1 для любой данной серии. Вы можете проверить это сами:

type(np.nan)  # float

Обычно это не нарушает последующие манипуляции / вычисления, и эффективно сохранять ваши ряды float. Преобразование такого ряда в int невозможно и обходные пути неэффективны. Поэтому я советую вам ничего не делать.


1 Это адаптивное поведение описано в документах :

Примечание : при работе с разнородными данными будет выбран d-тип результирующего ndarray для размещения всех данных участвует. Например, если задействованы строки, результат будет объект dtype. Если есть только числа с плавающей точкой и целые числа, массив будет иметь тип float d *.

0 голосов
/ 06 сентября 2018

используйте это после кода:

pd.options.display.float_format = '{:,.0f}'.format
print(df)

@ Jpp там прав. Это просто изменит ваш визуальный элемент, чтобы вы могли напечатать 1 вместо 1,0

Также, если вы используете это решение, обязательно прочитайте о pd.reset_option https://pandas.pydata.org/pandas-docs/stable/options.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...