我正在尝试将DataFrame的列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,'\n\n',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,'\n\n',df.memory_usage())
返回:
a int64
b object
dtype: object
Index 80
a 24
b 24
dtype: int64
有人可以向我解释我在这里做错了吗?
答案 0 :(得分:1)
可能是一个错误。我认为当对除int和float之外的dtypes进行转换时,pandas倾向于保留现有列的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
a int64 b |S4 dtype: object