Почему pd.concat изменяет результирующий тип данных с int на float?

У меня есть три фрейма данных: timestamp (с временными метками), dataSun (с временными метками восхода и заката), dataData (с разными климатическими данными). Фрейм данных timestamp имеет тип данных "int64".

timestamp.head() timestamp 0 1521681600000 1 1521681900000 2 1521682200000 3 1521682500000 4 1521682800000

Фрейм данных dataSun также имеет тип данных "int64".

 dataSun.head()
         sunrise         sunset
0  1521696105000  1521740761000
1  1521696105000  1521740761000
2  1521696105000  1521740761000
3  1521696105000  1521740761000
4  1521696105000  1521740761000

Фрейм данных с климатическими данными dataData имеет тип данных "float64".

dataData.head()
           temperature     pressure  humidity
    0     2.490000  1018.000000      99.0
    1     2.408333  1017.833333      99.0
    2     2.326667  1017.666667      99.0
    3     2.245000  1017.500000      99.0
    4     2.163333  1017.333333      99.0
    5     2.081667  1017.166667      99.0

Я хочу объединить эти три фрейма данных в один.

dataResult = pd.concat((timestamp, dataSun, dataData), axis = 1)
dataResult.head()
       timestamp       sunrise        sunset  temperature     pressure     
0  1521681600000  1.521696e+12  1.521741e+12     2.490000  1018.000000   
1  1521681900000  1.521696e+12  1.521741e+12     2.408333  1017.833333   
2  1521682200000  1.521696e+12  1.521741e+12     2.326667  1017.666667   
3  1521682500000  1.521696e+12  1.521741e+12     2.245000  1017.500000   
4  1521682800000  1.521696e+12  1.521741e+12     2.163333  1017.333333   
5  1521683100000  1.521696e+12  1.521741e+12     2.081667  1017.166667   

weatherMeasurements.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7188 entries, 0 to 7187
Data columns (total 6 columns):
timestamp      7188 non-null int64
sunrise        7176 non-null float64
sunset         7176 non-null float64
temperature    7176 non-null float64
pressure       7176 non-null float64
humidity       7176 non-null float64
dtypes: float64(5), int64(1)

Почему pd.concat изменил тип данных значений DataSun? Я пробовал разные способы объединения фреймов данных. Например, я объединил только timestamp и dataSun в один фрейм данных, затем я объединил результирующий фрейм данных с dataData. Но результат был тот же. Как я могу объединить три фрейма данных и защитить типы данных?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
15
0
9 508
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из-за этого -

timestamp      7188 non-null int64
sunrise        7176 non-null float64
...

timestamp имеет 7188 ненулевых значений, в то время как sunrise и более поздние версии имеют 7176. Само собой разумеется, что есть 12 значений, которые нет не равны нулю ... то есть они NaN.

Поскольку NaN имеют dtype=float, каждое другое значение в этом столбце автоматически преобразуется в число с плавающей запятой, а большие числа с плавающей запятой обычно представлены в экспоненциальной нотации.

Это Зачем, но это не решает вашу проблему. Ваши варианты на данный момент:

  1. отбросьте эти строки с NaN, используя dropna
  2. заполните эти NaN некоторым целочисленным значением по умолчанию, используя fillna

(Теперь вы можете преобразовать эти строки в int.)

  1. В качестве альтернативы, если вы выполняете pd.concat с join='inner', NaN вводятся нет, а типы dtypes сохраняются.

    pd.concat((timestamp, dataSun, dataData), axis=1, join='inner')
    
           timestamp        sunrise         sunset  temperature     pressure  \    
    0  1521681600000  1521696105000  1521740761000     2.490000  1018.000000   
    1  1521681900000  1521696105000  1521740761000     2.408333  1017.833333   
    2  1521682200000  1521696105000  1521740761000     2.326667  1017.666667   
    3  1521682500000  1521696105000  1521740761000     2.245000  1017.500000   
    4  1521682800000  1521696105000  1521740761000     2.163333  1017.333333   
    
       humidity  
    0      99.0  
    1      99.0  
    2      99.0  
    3      99.0  
    4      99.0 
    

В варианте 3 выполняется внутреннее соединение индексов каждого фрейма данных.

Ты абсолютно прав. Я не проверял код внимательно. Я уже поправил и работает нормально. Большое спасибо!

M.Nelly 03.05.2018 09:52

Что касается pandas 1.0.0, я считаю, что у вас есть другой вариант - сначала использовать convert_dtypes. Это преобразует столбцы фрейма данных в типы dtypes, которые поддерживают pd.NA, избегая проблем с NaN, обсуждаемых в ответе это.

Другие вопросы по теме