【问题标题】:Optimize a for loop applied on all elements of a df优化应用于 df 的所有元素的 for 循环
【发布时间】:2017-04-15 01:08:09
【问题描述】:

编辑:这是第一行:

df = pd.read_csv(os.path.join(path, file), dtype = str,delimiter = ';',error_bad_lines=False, nrows=50)
df["CALDAY"] = df["CALDAY"].apply(lambda x:dt.datetime.strptime(x,'%d/%m/%Y'))
df = df.fillna(0)

我有一个包含 1500 列和 35000 行的 csv 文件。它包含值,但例如以 1.700,35 的形式,而在 python 中我需要 1700.35。当我阅读 csv 时,所有值都属于 str 类型。

为了解决这个问题,我写了这个函数:

def format_nombre(df):
    for i in range(length):
        for j in range(width):
            element = df.iloc[i,j]
            if (type(element) != type(df.iloc[1,0])):
                a = df.iloc[i,j].replace(".","")
                b = float(a.replace(",","."))
                df.iloc[i,j] = b

基本上,我选择所有行和列的每个交集,替换有问题的字符,将元素转换为浮点数,然后在数据框中替换它。 if 确保该函数不考虑日期,这些日期位于我的数据框的第一列中。

问题在于,虽然该函数完全符合我的要求,但覆盖 10 行大约需要 1 分钟,因此转换我的 csv 需要不到 60 小时。

我意识到这远未得到优化,但我苦苦挣扎,未能找到适合我的需求和(稀缺)技能的方法。

【问题讨论】:

  • 你的 csv 中的分隔符是什么?例如,如果它不是逗号,那么以下内容将起作用pd.read_csv(your_file, thousands='.', decimal=',', sep=some_separator)
  • 还包括问题中文件的前 5-6 行以及您尝试构建的 DF 格式。
  • 我已经尝试过了,但它不起作用,',' 仍然存在,因此我以后无法将其转换为浮点数。
  • Mohammad 你所说的“df 格式”是什么意思?这个想法是从字符串开始,然后修改它们以将它们变成浮点数。

标签: python loops csv pandas dataframe


【解决方案1】:

怎么样:

def to_numeric(column):
    if np.issubdtype(column.dtype, np.datetime64):
        return column
    else:
        return column.str.replace('.', '').str.replace(',', '.').astype(float)

df = df.apply(to_numeric)

这是假设所有字符串都是有效的。否则使用pd.to_numeric 而不是astype(float)

【讨论】:

  • 话虽如此,我很惊讶@EdChum 在 cmets 中的解决方案不起作用。
  • 这个解决方案很完美!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2015-07-24
  • 2015-12-24
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多