我有三个数据框:时间戳(带有时间戳),dataSun(带有日出和日落的时间戳),dataData(带有不同的气候数据)。数据框timestamp具有数据类型"int64"

timestamp.head() timestamp0 15216816000001 15216819000002 15216822000003 15216825000004 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的数据类型?我尝试了各种方法来串联数据帧。例如,我只在一个数据框中连接了timestampdataSun,然后又将我的结果数据框与dataData连接了。但这是相同的结果。
如何连接三个数据帧并保护数据类型?

最佳答案

因为这 -

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


timestamp具有7188个非空值,而sunrise及之后的具有7176个值。不言而喻,有12个非非null值……意味着它们是NaN。

由于NaN的值是dtype=float,因此该列中的所有其他值都会自动转换为浮点数,并且通常以科学计数法表示较大的浮点数。

这就是原因,但这并不能真正解决您的问题。此时您的选择是


使用dropna用NaN删除那些行
使用fillna用默认的整数值填充这些NaN


(现在,您可以将这些行转换为整数。)


或者,如果对pd.concat执行join='inner',则不会引入NaN并保留dtype。

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,将对每个数据帧的索引执行内部联接。

关于python - 为什么pd.concat将结果数据类型从int更改为float?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49940511/

10-12 22:27
查看更多