¿Por qué pd.concat cambia el tipo de datos resultante de int a float?

Tengo tres marcos de datos: marca de hora (con marcas de hora), dataSun (con marcas de hora de amanecer y anochecer), dataData (con diferentes datos de clima). La timestamp dataframe tiene el tipo de datos "int64" .

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

Dataframe dataSun también tiene el tipo de datos "int64" .

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

Marco de datos con datos de datos climáticos dataData tiene el tipo de datos "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 

Quiero concatenar estos tres marcos de datos en uno.

 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()  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) 

¿Por qué pd.concat ha pd.concat el tipo de datos de los valores DataSun ? He intentado diferentes maneras de concatenar los marcos de datos. Por ejemplo, concatené solo timestamp y dataSun en un dataframe, luego concatené el marco de dataData resultante con dataData . Pero fue el mismo resultado. ¿Cómo puedo concatenar tres marcos de datos y asegurar los tipos de datos?

Debido a esto –

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

timestamp tiene 7188 valores no nulos, mientras que sunrise y en adelante tienen 7176. No hace falta decir que hay 12 valores que no son nulos … lo que significa que son NaNs.

Dado que los NaN son de dtype=float , todos los demás valores de esa columna se actualizan automáticamente para flotar, y los números flotantes tan grandes generalmente se representan en notación científica.

Ese es el porqué , pero eso realmente no resuelve tu problema. Sus opciones en este punto son

  1. soltar esas filas con NaNs usando dropna
  2. rellene esos NaN con algún valor entero predeterminado usando fillna

(Ahora puedes bajar estas filas a int.)

  1. Alternativamente, si realiza pd.concat con join='inner' , los NaN no se introducen y los tipos se conservan.

     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 

Con la opción 3, se realiza una unión interna en los índices de cada dataframe.