2016-11-30 64 views
0

編輯的所有要素:這裏是第一行:優化A用於在DF

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小時。我意識到這遠沒有被優化,但我掙扎着,未能找到適合我需求和(稀缺)技能的方式。

+3

csv中的分隔符是什麼?例如,如果它不是逗號,那麼以下代碼將工作:'pd.read_csv(your_file,thousands ='。',decimal =',',sep = some_separator)' – EdChum

+0

還包括問題中的第一個5-6行文件,你正試圖構建的DF的格式。 – MYGz

+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)

+0

這就是說,我很驚訝@ EdChum的解決方案在評論中不起作用。 – IanS

+0

該解決方案非常完美!非常感謝 ! –