【问题标题】:Change dtypes in Pandas DataFrame cell-by-cell逐个单元格更改 Pandas DataFrame 中的 dtypes
【发布时间】:2019-03-24 02:03:17
【问题描述】:

问题:

我有一个只存储 unicode 值的 Pandas.DataFrame。每列包含可以转换为整数或浮点数或保留为 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. 如果可能的话,转换成浮点数,转换成浮点数
  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(),但似乎都没有处理列中混合类型的情况。

【问题讨论】:

  • 最好为每个 xy 创建 3 个新列,以便您最终得到 x_intx_floatx_str 并相应地构造后续代码。
  • 在一天结束时,列数及其名称必须保持不变。您是否建议将此作为中间步骤?
  • Python 2.7.15 版,Pandas 0.23.0 版(更新问题)
  • 不,我建议在 1 列中有多个类型表示逻辑错误,最好将类型分成自己的列
  • @haleemur-ali 我同意,但不幸的是,我需要将数据混合在原始列中

标签: python pandas


【解决方案1】:

尝试将函数与 .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)

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 2016-12-26
    • 2017-08-27
    • 2021-01-25
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2023-02-16
    相关资源
    最近更新 更多