就地更改熊猫系列/数据框列的类型

ElR*_*udi 13 python pandas

TL;DR:我想就地更改熊猫数据框列的数据类型。


我有一个熊猫数据框:

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

默认情况下,它的列在我的系统上分配了“int64”和“float64”:

df.dtypes
Out[172]: 
a      int64
b    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

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

df['a'] = df['a'].astype(np.int32)
df['b'] = df['b'].astype(np.float32)
Run Code Online (Sandbox Code Playgroud)

或者,在一个步骤中:

df = df.astype({'a':np.int32, 'b':np.float32})
Run Code Online (Sandbox Code Playgroud)

我的数据框的 dtypes 确实是:

df.dtypes
Out[180]: 
a      int32
b    float32
dtype: object
Run Code Online (Sandbox Code Playgroud)

但是:这看起来很笨拙,必须重新分配系列,尤其是。因为许多inplacePandas方法都有一个kwarg。但是,使用它似乎不起作用(从顶部的相同数据框开始):

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

df.dtypes
Out[187]: 
a      int64
b    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

有什么我在这里俯瞰的吗?这是故意的吗?使用Series代替DataFrame对象时显示相同的行为。

非常感谢,

Phi*_*ipp 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)
Run Code Online (Sandbox Code Playgroud)

并像这样使用它

astype_inplace(df, {'bool_col':'boolean'})
Run Code Online (Sandbox Code Playgroud)

或者

astype_per_column(df, 'bool_col', 'boolean')
Run Code Online (Sandbox Code Playgroud)