逐个单元地更改Pandas DataFrame中的dtypes

时间:2019-03-22 15:36:40

标签: python pandas

问题:

我有一个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

我想按如下方式转换每个单元格的类型:

  1. 如果可以转换为int,请转换为int
  2. 否则,可能会转换为float,转换为float
  3. 否则,保留为Unicode

解决方案尝试:

以下代码正是我想要的:

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(),但似乎都无法处理列中混合类型的情况。

1 个答案:

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