将Int64设置为熊猫的默认整数dtype

时间:2019-05-20 12:03:00

标签: python python-3.x pandas numpy

我希望所有数据框,无论它们是由任何构造函数重载构建而成,还是从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>

我的问题是,这可以做到吗?如果是这样,我将如何处理?

谢谢。

2 个答案:

答案 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

当然,您冒着破坏世界的风险。祝你好运!