防止熊猫在创建数据框时将整数强制转换为浮点数

时间:2020-06-06 08:43:54

标签: python pandas dataframe dtype

我从11个列表中创建一个数据框。这些列表中有四个是整数列表,其余七个是浮点列表。我使用以下所有11个列表创建了一个数据框

df = pd.DataFrame({  col_headers[0]  : pd.Series(upper_time,   dtype='float'), 
                     col_headers[1]  : pd.Series(upper_pres,   dtype='float'),
                     col_headers[2]  : pd.Series(upper_indx,   dtype='int'),
                     col_headers[3]  : pd.Series(upper_pulses, dtype='int'), 
                     col_headers[4]  : pd.Series(median_upper_pulses, dtype='float'),
                     col_headers[5]  : pd.Series(lower_time,   dtype='float'),
                     col_headers[6]  : pd.Series(lower_pres,   dtype='float'), 
                     col_headers[7]  : pd.Series(lower_indx,   dtype='int'),
                     col_headers[8]  : pd.Series(lower_pulses, dtype='int'), 
                     col_headers[9]  : pd.Series(median_lower_pulses, dtype='float'),
                     col_headers[10] : pd.Series(median_both_pulses,  dtype='float')
                        })

不幸的是,当我键入df.dtypes时。我得到

df.dtypes
Upper Systole Time              float64
Upper Systole Pressure          float64
Upper Systole Index               int32
Upper Systole Pulses              int32
Median Upper Systolic Pulses    float64
Lower Systole Time              float64
Lower Systole Pressure          float64
Lower Systole Index             float64
Lower Systole Pulses            float64
Median Lower Systolic Pulses    float64
Median Both Systolic Pulses     float64
dtype: object

上收缩指数,下收缩指数,上收缩脉冲和下收缩脉冲都应为整数(如果我检查相关列表中每个元素的类型,则为整数)。但是以某种方式,当我创建一个数据框时,尽管我明确地将其保留为整数,但四个整数中的两个仍被强制浮动。

我怀疑这与以下事实有关:列表0-4的长度是一个长度,列表5-10的长度是不同的,但是很多Google搜索和StackOverflow搜索都没有给出答案。

如何确保自己的积分仍然是整数?

2 个答案:

答案 0 :(得分:0)

如果您执行以下操作:

pd.DataFrame({"A":pd.Series([1,2,3,4], dtype='int'),
             "B": pd.Series([1,3], dtype='int')}).astype(int)

您将收到以下错误:

    867         if not np.isfinite(arr).all():
--> 868             raise ValueError("Cannot convert non-finite values (NA or inf) to integer")
    869 
    870     elif is_object_dtype(arr):

ValueError: Cannot convert non-finite values (NA or inf) to integer

这表明问题出在NaN的存在。

如果要将NaN值转换为整数,例如0,那么您应该可以使用.astype(int)将指定的列强制转换为整数

示例:

df = pd.DataFrame({"A":pd.Series([1,2,3,4], dtype='int'),
             "B": pd.Series([1,3], dtype='int')})

df["B"] = df["B"].fillna(0).astype(int)

答案 1 :(得分:0)

filippo, 非常感谢您-dytpe ='Int64'用大写的'I'完成了。我没有意识到这一点,它很好地写在https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html上,其中指出pd.Int64Dtype()别名为'Int64'。

再次感谢

托马斯·飞利浦