我希望所有数据框,无论它们是由任何构造函数重载构建而成,还是从read_csv,read_xlsx,read_sql或任何其他方法派生,都可以使用新的可为空的Int64 dtype (http://pandas-docs.github.io/pandas-docs-travis/whatsnew/v0.24.0.html#optional-integer-na-support)作为所有整数的默认dtype,而不是int64。
如果没有一种“不错”的方法,我愿意在任何程度上做到疯狂,包括子类化DataFrame或Series类,以及重新实现任何数量的方法和构造函数属性,等等。 / p>
我的问题是,这可以做到吗?如果是这样,我将如何处理?
谢谢。
答案 0 :(得分:1)
您可以使用如下功能:
def nan_ints(df,convert_strings=False,subset = None):
types = ['int64','float64']
if subset == 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以外的int时,它才会转换为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()
x.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上使用此函数,则可以将函数添加到模块中,并在每次要使用熊猫时导入它。
from my_module import nan_ints
然后只需将其与以下内容一起使用:
nan_ints(pd.read_csv(path))
答案 1 :(得分:1)
我会把钱花在修补猴子上。最简单的方法是猴子修补DataFrame构造函数。那应该是这样的:
import pandas
pandas.DataFrame.__old__init__ = pandas.DataFrame.__init__
def new_init(self, data=None, index=None, columns=None, dtype=pd.Int64Dtype(), copy=False):
self.__old__init__(data=data, index=index, columns=None, dtype=dtype, copy=copy)
pandas.DataFrame.__init__ = new_init
当然,您冒着破坏世界的风险。祝你好运!