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

时间:2019-03-26 10:48:43

标签: python pandas

TL; DR :我想就地更改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。我知道我该怎么做:

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

,或一步:

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

和我数据框的dtype确实是:

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

但是:这似乎很笨拙,尤其是必须重新分配系列。因为许多熊猫方法都具有inplace kwarg。但是,使用它似乎无效(从顶部的相同数据框开始):

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

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

这里有什么我可以俯瞰的地方吗?这是设计使然吗?使用Series而不是DataFrame对象时,会显示相同的行为。

非常感谢,

3 个答案:

答案 0 :(得分:3)

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

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')

答案 1 :(得分:0)

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

答案 2 :(得分:-2)