在pandas系列/数据框中,如何原地更改列的类型

26

TL;DR: 我想就地更改Pandas数据帧列的数据类型。


我有一个Pandas数据帧:

df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6.1]})

在我的系统上,默认情况下会给列分配'int64'和'float64':

df.dtypes
Out[172]: 
a      int64
b    float64
dtype: object

因为我的数据框非常大,所以我想在创建数据框之后设置列数据类型为int32和float32。 我知道如何做到这一点:

由于我的数据框非常大,所以在创建完数据框后,我希望将列的数据类型设置为int32和float32。我知道如何实现:

df['a'] = df['a'].astype(np.int32)
df['b'] = df['b'].astype(np.float32)

或者,一步到位:

df = df.astype({'a':np.int32, 'b':np.float32})

我的数据框的数据类型确实是:

df.dtypes
Out[180]: 
a      int32
b    float32
dtype: object

然而:这种方式似乎很笨重,需要重新分配系列,特别是因为许多pandas方法都有一个inplace参数。然而,使用这种方法似乎不起作用(从顶部开始使用相同的数据帧):

df['a'].astype(np.int32, inplace=True)

df.dtypes
Out[187]: 
a      int64
b    float64
dtype: object

我有没有漏掉什么?这是故意的吗?在使用 DataFrame 对象时,如果使用 Series 也会出现相同的行为。

非常感谢。


2
在我看来,原地操作比df = df.astype({'a':np.int32, 'b':np.float32})更加笨重 :) - anky
我不确定,但我认为那是不可能的。 - Rafael
3
inplace 操作与重新赋值相比并无内存节省。 - cs95
1
很抱歉,似乎没有办法做到这一点,因为pandas API https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html 没有提供这样的功能。 - Matěj Račinský
10
@coldspeed,这不是关于节省内存的问题,而是关于“代码流程”以及我如何思考我正在操作的对象。 "更正它们"比"用新版本覆盖它们"更符合形象化。此外,在某些操作中提供"inplace"选项似乎是一个奇怪的决定,并且在我的最后一个例子中,它的静默失败更加离奇。 - ElRudi
4个回答

5

您可以编写自己的(仍然笨拙的)就地版本:

def astype_inplace(df: pd.DataFrame, dct: Dict):
    df[list(dct.keys())] = df.astype(dct)[list(dct.keys())]

def astype_per_column(df: pd.DataFrame, column: str, dtype):
    df[column] = df[column].astype(dtype)

并像这样使用它

astype_inplace(df, {'bool_col':'boolean'})

或者
astype_per_column(df, 'bool_col', 'boolean')

嗨,我在Google Colab上得到了以下错误提示: “NameError:name 'Dict' is not defined” 你知道这个Dict函数从哪里来吗?先感谢了。 - Mauro Del Nook
1
我相信这是通用类型 typing.Dict - Philipp
仍然可以在2022年正常工作,只需按建议添加“from typing import Dict”。 - SimAzz

2

那么关于IT技术方面的内容呢?

>>> df.__dict__.update(df.astype({'a': np.int32, 'b': np.float32}).__dict__)
>>> df.dtypes
a      int32
b    float32
dtype: object

?


-2
将列名及其数据类型作为字典传递给.astype()方法作为参数。
col_types = {'col_1':'type_1', 'col_4':'type_4'}
df = df.astype( col_types)

它将仅更改通过字典传递的列的数据类型


3
这不是原地进行更改。 - Davidmh

-3

1
这实际上并不改变数据框中包含的系列的类型,只是操作其底层数据。 - Evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接