我需要更改多列的dtype(超过400个),但是数据框具有不同类型的dtype。某些列的dtypes为float64
,而某些列的dtypes为int64
或object
:
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
更改为int8
或int16
,还需要将所有float64
更改为float32
。我已经尝试了以下代码段,但是没有用:
my_df[my_df.dtypes == np.int64].astype(np.int16)
my_df[my_df.dtypes == np.float64].astype(np.float32)
感谢您的帮助。
先谢谢了。
答案 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)