TL;DR:我想就地更改熊猫数据帧列的数据类型。
我有一个熊猫数据帧:
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
对象时,也会显示相同的行为。
非常感谢,
您可以编写自己的(仍然笨拙的(就地版本:
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')
那呢
>>> df.__dict__.update(df.astype({'a': np.int32, 'b': np.float32}).__dict__)
>>> df.dtypes
a int32
b float32
dtype: object
?
将列名及其数据类型作为字典作为参数在 .astype(( 中传递
col_types = {'col_1':'type_1', 'col_4':'type_4'}
df = df.astype( col_types)
它将仅更改通过字典传递的列的数据类型
> @ElRudi
正如我阅读的精细手册:copy=False
可能适合您的需求?
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html?highlight=astype#pandas.DataFrame.astype