逐个更改Pandas DataFrame中的dtypes

问题描述 投票:0回答:1

问题:

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

我想将每个单元格的类型转换如下:

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

python pandas
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.