熊猫只更改floattype列的dtypes

时间:2018-08-05 22:36:02

标签: python pandas

我需要更改多列的dtype(超过400个),但是数据框具有不同类型的dtype。某些列的dtypes为float64,而某些列的dtypes为int64object

print my_df.dtypes

输出:

x1                       int64
x2                       int64
x3                       object
x4                       float64
x5                       float64
x6                       float64
x7                       float64
...

x400                     object
x401                     object
x402                     object
...

我需要将所有int64更改为int8int16,还需要将所有float64更改为float32。我已经尝试了以下代码段,但是没有用:

my_df[my_df.dtypes == np.int64].astype(np.int16)
my_df[my_df.dtypes == np.float64].astype(np.float32)

感谢您的帮助。

先谢谢了。

4 个答案:

答案 0 :(得分:1)

您可以构建映射词典并使用astype

new_types = {np.dtype(np.int64): np.int16, 
             np.dtype(np.float64): np.float32}

df = df.astype(df.dtypes.map(new_types).to_dict())

示例:

df = pd.DataFrame({'col1': [1,2,3], 'col2': [1.0,2.0,3.0]})

    col1    col2
0   1       1.0
1   2       2.0
2   3       3.0

>>> df.dtypes

col1      int64
col2    float64
dtype: object

然后

df.dtypes.map({np.dtype(np.int64): np.int16, np.dtype(np.float64): np.float32}).to_dict()

给出新类型的命令

{'col1': numpy.int16, 'col2': numpy.float32}

然后将astype与该字典配合使用

>>> df.astype(df.dtypes.map(new_types).to_dict())

col1      int16
col2    float32
dtype: object

答案 1 :(得分:1)

设置

df = pd.DataFrame({'a': np.arange(5, dtype='int64'), 'b': np.arange(5, dtype='float64')})

使用select_dtypes获取与所需类型匹配的列:

df.select_dtypes(np.float64) # or df.select_dtypes(np.float64).columns to save for casting

     b
0  0.0
1  1.0
2  2.0
3  3.0
4  4.0

并根据需要进行投射。

答案 2 :(得分:1)

您几乎明白了!

my_df.loc[:, my_df.dtypes == 'float64'] = my_df.loc[:, my_df.dtypes == 'float64'].astype('float32')
my_df.loc[:, my_df.dtypes == 'int64'] = my_df.loc[:, my_df.dtypes == 'int64'].astype('int32')

答案 3 :(得分:0)

好吧,我找到了路:)

查找dtype为float64的列

cols = my_df.select_dtypes(include=[np.float64]).columns

然后仅更改数据框的cols的类型。

my_df[cols] = my_df[cols].astype(np.float32)