问题:
我有一个Pandas.DataFrame,它仅存储unicode值。每列包含可以转换为整数或浮点数或保留为unicode的值。 (Python版本2.7.15,熊猫版本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()
,但似乎都无法处理列中混合类型的情况。
答案 0 :(得分:2)
尝试与.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)