Mat*_*GdV 17 python numpy python-3.x pandas
我想我所有的dataframes,无论他们是从构造函数重载的任何一个建立起来的,无论他们是来自衍生.read_csv()
,.read_xlsx()
,.read_sql()
,或任何其他方法,使用新的可为空的Int64
数据类型为默认dtype
将所有整数,而不是int64
。
如果没有一种“不错”的方法,我愿意在任何程度上做到疯狂,包括子类化DataFrame或Series类,以及重新实现任意数量的方法和构造函数属性等。
我的问题是,可以做到吗?如果是这样,我将如何处理?
小智 4
你可以使用这样的函数:
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
Run Code Online (Sandbox Code Playgroud)
它迭代每一列,如果它是 int,则将其转换为 Int64。如果它是浮点数,则仅当列中的所有值都可以转换为除 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()
Run Code Online (Sandbox Code Playgroud)
将返回以下内容:
<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
Run Code Online (Sandbox Code Playgroud)
如果你打算在每个 DataFrame 上使用它,你可以将该函数添加到一个模块中,并在每次你想使用 pandas 时导入它。
from my_module import nan_ints
然后将它与类似的东西一起使用:
nan_ints(pd.read_csv(path))
注意:可空整数数据类型是版本 0.24.0 中的新增内容。这是文档。