我正在尝试将数据框的列DTYPE更改为S2。如果我使用浮点数据进行操作,它效果很好:
>>>df = pd.DataFrame({'a':[1,2,3],'b':[1.1,3.2,5.6]})
>>>df['b'] = df['b'].astype('|S4',copy=False)
>>>print(df.dtypes,'nn',df.memory_usage())
返回:
a int64
b |S4
dtype: object
Index 80
a 24
b 12
dtype: int64
但是,当我尝试使用同样的字符串时:
>>>df = pd.DataFrame({'a':[1,2,3],'b':['a','b','c']})
>>>df['b'] = df['b'].astype('|S4',copy=False)
>>>print(df.dtypes,'nn',df.memory_usage())
返回:
a int64
b object
dtype: object
Index 80
a 24
b 24
dtype: int64
有人可以向我解释我在这里做错了什么?
可能是一个错误。我认为,当将铸件铸造到int和float以外的其他dtypes时,大熊猫倾向于保留现有列的object dtype
。因此,要更改dtype
将其分配给新列。即
df = pd.DataFrame({'a':[1,2,3],'b':['1.1','3.2','5.6']})
df['b'] = df['b'].astype('|S4',copy=False)
df['c'] = df['b'].astype('|S4',copy=False)
输出:
a int64
b object
c |S4
dtype: object
Index 80
a 24
b 24
c 12
dtype: int64
或临时解决方案
df = pd.DataFrame({'a':[1,2,3],'b':['1.1','3.2','5.6']})
b = df['b'].astype('|S4',copy=False)
del df['b']
df['b'] = b
df.dtypes
INT64B | S4dtype:对象