你可以使用这样的函数:
def nan_ints(df,convert_strings=False,subset = None):
types = ['int64','float64']
if subset is None:
subset = list(df)
if convert_strings:
types.append('object')
for col in subset:
try:
if df[col].dtype in types:
df[col] = df[col].astype(float).astype('Int64')
except:
pass
return df
它遍历每一列,如果它是 int,则将其转换为 Int64。如果它是浮点数,则只有当列中的所有值都可以转换为 NaN 以外的整数时,它才会转换为 Int64。我已经为您提供了将字符串转换为 Int64 的选项以及 convert_strings 参数。
df1 = pd.DataFrame({'a':[1.1,2,3,1],
'b':[1,2,3,np.nan],
'c':['1','2','3',np.nan],
'd':[3,2,1,np.nan]})
nan_ints(df1,convert_strings=True,subset=['b','c'])
df1.info()
将返回以下内容:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
a 4 non-null float64
b 3 non-null Int64
c 3 non-null Int64
d 3 non-null float64
dtypes: Int64(2), float64(2)
memory usage: 216.0 bytes
如果你打算在每个 DataFrame 上使用它,你可以将函数添加到模块中,并在每次你想使用 pandas 时导入它。
from my_module import nan_ints
然后只需将其与以下内容一起使用:
nan_ints(pd.read_csv(path))
注意:可空整型数据类型是 0.24.0 版中的新增功能。
这是documentation。