优化应用于df的所有元素的for循环

时间:2016-11-30 16:08:20

标签: python loops csv pandas dataframe

编辑:这是第一行:

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确保函数不考虑日期,这些日期位于我的数据帧的第一列。

问题在于虽然功能完全符合我的要求,但是需要大约1分钟来覆盖10行,所以转换我的csv需要不到60小时。

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

1 个答案:

答案 0 :(得分:0)

怎么样:

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)