2016-03-03 71 views
0

我正在嘗試製作一個.csv文件,其格式既簡單易讀,也易於熊貓讀取。這意味着應該將列整齊分開,以便您可以輕鬆識別每個值屬於哪個列。問題是,填充空白區域在熊貓功能方面有一些縮減。到目前爲止,我得到了什麼是如何完全忽略csv中的空白與熊貓

work ,roughness ,unstab ,corr_c_w ,u_star ,c_star 
us  ,True  ,True ,-0.39  ,0.35 ,-.99 
wang ,False  ,  ,-0.5  ,  , 
cheng ,   ,True ,   ,  , 
watanabe,   ,  ,   ,0.15 ,-.80 

如果我採取了上述的.csv所有的空格,並直接與pd.read_csv讀它,它完美的作品。前兩列是布爾值,其他的是浮點數。但是,如果沒有空格,它是不可讀的。當我與

pd.read_csv('bibrev.csv', index_col=0) 

看了上面的.csv這是行不通的,因爲所有的列,並認爲字符串包括,顯然,空格。當我使用

pd.read_csv('bibrev.csv', index_col=0, skipinitialspace=True) 

那麼樣的作品,因爲花車讀爲花車和缺失值讀取爲NaN s,這是一個很大的進步。但是,列名和布爾列仍然是帶空格的字符串。

任何直接用熊貓閱讀.csv的方法?或者,也許偶然的csv格式有點,仍然有一個清晰的閱讀與人類可讀的.csv?

PS:我試圖避免使用python作爲字符串讀取所有內容,替換空格,然後將其提供給熊貓,並且還試圖避免定義一些函數並通過converters關鍵字將它傳遞給熊貓。

回答

0

試試這個:

import pandas as pd 

def booleator(col): 
    if str(col).lower() in ['true', 'yes']: 
     return True 
    #elif str(col).lower() == "false": 
    # return False 
    else: 
     return False 

df = pd.read_csv('data.csv', sep='\s*,\s*', index_col=0, 
       converters={'roughness': booleator, 'unstab': booleator}, 
       engine='python') 
print(df) 
print(df.dtypes) 

輸出:

  roughness unstab corr_c_w u_star c_star 
work 
us   True True  -0.39 0.35 -0.99 
wang   False False  -0.50  NaN  NaN 
cheng  False True  NaN  NaN  NaN 
watanabe  False False  NaN 0.15 -0.80 
roughness  bool 
unstab   bool 
corr_c_w  float64 
u_star  float64 
c_star  float64 
dtype: object 

此版本還需要布爾照顧 - 所有NaN的將被轉換爲False,否則熊貓將推動D型到對象(詳見技術我的評論)...

+0

我認爲它實際上應該是'pd.read_csv('bibrev.csv',sep ='\ s +,',index_col = 0)'對嗎?但它工作得很好,除了布爾列是一個字符串,而不是布爾。 – TomCho

+0

@TomCho,是的,你是對的,我已經更新了我的答案。我將檢查布爾值...... – MaxU

+0

@TomCho,「通過reindex或其他方法將NAs引入到現有的Series或DataFrame中時,布爾類型和整數類型將被提升爲不同的dtype以存儲NAs」 - http ://pandas.pydata.org/pandas-docs/stable/gotchas.html。所以,你會首先擺脫NaNs ... – MaxU