您可以使用类似这样的函数:
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:
if df[col].dtype in types:
df[col] = (
df[col].astype(float, errors="ignore").astype("Int64", errors="ignore")
)
return df
该代码会遍历每一列并将其转换为Int64(整数),如果是int,则将其转换为Int64。 如果是float,则仅当该列中的所有值都可以转换为int(除了NaN)时,才将其转换为Int64。 我们还提供了一个选项,可以使用convert_strings参数将字符串转换为Int64。
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版本开始的新特性。这里是文档。