将PANDAS DataFrame列dtypes转换为某些尺寸(| S2)的字符串



我正在尝试将数据框的列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:对象

相关内容

最新更新