麻烦将Pandas DataFrame列dtypes转换为特定大小的字符串(| S2)

时间:2017-09-24 05:32:50

标签: python pandas dataframe

我正在尝试将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

有人可以向我解释我在这里做错了吗?

1 个答案:

答案 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