Python 如果包含Nan,则整型变量变为浮点

Python 如果包含Nan,则整型变量变为浮点,python,pandas,dataframe,Python,Pandas,Dataframe,虽然在操作系统中有很多讨论提到从0.24开始将Nan integer添加到Pandas中的功能,但当我使用read_csv()读取csv文件时,它会再次将包含Nan的integer值检测为float 我是做错了什么还是这是正常的行为? 如果是这样的话,解决方法是什么? 重要的是,在我的用例中,如果您使用astype(),我可以正确地检测变量的类型 df = pd.DataFrame({"intwithnan":[random.randint(0,100)

虽然在操作系统中有很多讨论提到从0.24开始将Nan integer添加到Pandas中的功能,但当我使用
read_csv()
读取csv文件时,它会再次将包含Nan
integer
值检测为
float

我是做错了什么还是这是正常的行为?
如果是这样的话,解决方法是什么?

重要的是,在我的用例中,如果您使用
astype()
,我可以正确地检测变量的类型

df = pd.DataFrame({"intwithnan":[random.randint(0,100) 
                                 if random.randint(0,3)<2 else np.nan 
                                 for i in range(20)]}).astype({"intwithnan":"Int64"})
df.to_csv("nan.csv", index=False)
df = pd.read_csv("nan.csv").astype({"intwithnan":"Int64"})
print(f"{df.dtypes}\n\n{df.to_string(index=False)}")

问题是用户可以加载不同的数据集,在其中我不知道哪些列实际上是要使用的整数
astype()
。在
读取\u csv()
的过程中,将自动检测类型。是否可以强制它加载Nan值为integer而不是not的整型列float@MohamadArmoon简单正确,只需尝试每一列。用另一段代码更新了答案听起来很合理。我想可能会阻止对所有数据集进行额外的遍历。但似乎不可避免地,您可以使用
df.dtypes.to_dict()
,只尝试将float64列转换为更有效的版本
intwithnan    Int64
dtype: object

 intwithnan
         97
         97
         66
         16
       <NA>
       <NA>
       <NA>
         59
         23
       <NA>
       <NA>
         95
         61
       <NA>
         26
         13
       <NA>
         48
         84
         19
df = pd.DataFrame({"intwithnan":[random.randint(0,100) 
                                 if random.randint(0,3)<2 else np.nan 
                                 for i in range(20)],
                  "stringcol":["abc" for i in range(20)]}).astype({"intwithnan":"Int64"})
df.to_csv("nan.csv", index=False)
df = pd.read_csv("nan.csv")
for c in df.columns:
    try: df = df.astype({c:"Int64"})
    except TypeError: pass
print(f"{df.dtypes}\n\n{df.to_string(index=False)}")