编辑:这是第一行:
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小时。
我意识到这远未被优化,但我挣扎并且未能找到适合我的需求和(稀缺)技能的方法。
答案 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)
。