问题:
我有一个Pandas.DataFrame,它只存储unicode值。每列包含可以转换为整数或浮点数的值,或者保留为unicode。 (Python版本2.7.15,Pandas版本0.23.0)
df = pd.DataFrame({'x':[u'1', u'1.23', u'', u'foo_text'], 'y':[u'bar_text', u'', u'2', u'4.56']})
print df
x y
0 1 bar_text
1 1.23
2 2
3 foo_text 4.56
我想将每个单元格的类型转换如下:
解决方案尝试
以下代码正是我想要的:
type_list = [int, float, unicode]
for column in df.columns:
for index in df.index:
for desired_type in type_list:
try:
df.loc[index,column] = desired_type(df.loc[index,column])
break
except ValueError:
pass
问题是我的实际DataFrame大于1000万个单元格,执行起来太长了。我试图找到一种更快的方法来做到这一点。
我看过pandas.DataFrame.infer_objects()
和pandas.to_numeric()
,但似乎都没有处理列中混合类型的情况。
尝试使用与.apply()
一起使用的函数,这将比三个嵌套的for循环快得多。
所以类似于:
def change_dtype(value):
try:
return int(value)
except ValueError:
try:
return float(value)
except ValueError:
return value
for column in df.columns:
df.loc[:, column] = df[column].apply(change_dtype)