pandas 检测新的Int64和Float64数据类型并Map到旧数据类型的可靠方法

hec6srdp  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(154)

我不知道新的dtypes叫什么,但是当我创建一个像

xdf = pd.DataFrame(
    {
        "a": pd.Series([1, 2, 3, 4], dtype=pd.Float64Dtype),
        "b": [True, False, True, False],
    }
)

a的dtype似乎是object:

>>> xdf.dtypes
a    object
b      bool
dtype: object

我相信,在早期(可能在不同的pandas版本上),它会显示出来,看起来像Float64。这些类型在使用sklearn时有时会导致问题,所以我想将它们(Int64Float64)转换回经典的float dtype以同时处理null。
有没有一种方法可以可靠地检测到一个dtype是一种新的类型?似乎对于一些版本,我可以得到dtype的字符串表示,看看它是否以大写字母开头,但我想知道是否有一个推荐的方法来检测新的(并最终转换回旧的)。最好是除了查看系列的所有内容并从所有类型中决定。
我有

pandas version: 1.4.4
numpy version: 1.21.6
yvt65v4c

yvt65v4c1#

我认为唯一的方法是使用这样的函数:

def change_dtype(series):
    
    if series.dtype == pd.Float64Dtype:
        return series.astype(float)
    
    if series.dtype == pd.Int64Dtype:
        return series.astype(int)
    
    return series

然后在dataframe的所有列中使用它,这些列的类型如下所示:

def fix_dtype_dataframe(df):
    new_num_cols = [col for col in xdf.columns if df[col].dtype in [pd.Float64Dtype, pd.Int64Dtype]]

    def fix_dtype_series(series):
    
        if series.dtype == pd.Float64Dtype:
            return series.astype(float)

        if series.dtype == pd.Int64Dtype:
            return series.astype(int)

        return series

    df[new_num_cols] = df[new_num_cols].apply(fix_dtype_series, axis=0)
    return df

xdf = pd.DataFrame(
    {
        "a": pd.Series([1, 2, 3, 4], dtype=pd.Float64Dtype),
        "b": [True, False, True, False],
    }
)

xdf = fix_dtype_dataframe(xdf)

相关问题