2016-12-12 307 views
2

是否可以製作熊貓。 read_csv()如果在輸入文件中找不到在usecols中指定的列,則會引發錯誤?例如。在下面的例子中,我想熊貓引發異常,因爲沒有輸入文件名爲「你好」欄:Pandas read_csv usecols接受不存在的列名稱

import pandas as pd 

# Write dummy-data 
csv = r"""col1,col2,col3 
one,two,three""" 
with open("data.csv", "w") as out: 
    out.write(csv) 

# Read dummy-data to DF 
df = pd.read_csv("data.csv", usecols=["col1", "col2", "hello"]) 
print df.to_string(index=False) 

輸出:

col1 col2 col3 
one two NaN 

所以熊貓讀取第三列名稱(「col3」)並用NaN填充它,而不是引發「hello」不存在的錯誤。我希望在閱讀該文件時獲得通知,而不必在將文件內容讀入內存之後對其進行驗證。

回答

9

你可以只讀取頭和測試,如果所有預期的列名都存在使用isin

In [10]: 
import io 
csv = r"""col1,col2,col3 
one,two,three""" 
# Read dummy-data to DF 
cols=["col1", "col2", "hello"] 
df = pd.read_csv(io.StringIO(csv), usecols=cols, nrows=0) 
df.columns.isin(cols) 

Out[10]: 
array([ True, True, False], dtype=bool) 

您可以使用all測試,如果所有的cols存在:

In [11]: 
df.columns.isin(cols).all() 

Out[11]: 
False 

另外你可以將面罩反轉以找到丟失的面孔:

In [18]: 
np.array(cols)[~df.columns.isin(cols)] 

Out[18]: 
array(['hello'], 
     dtype='<U5') 

您可以將此邏輯放在用戶func中,以返回任何缺少列名稱的列表:

def missingCol(cols, path): 
    read_cols = pd.read_csv(path, usecols=cols, nrows=0).columns 
    return np.array(cols)[~read_cols.isin(cols)].tolist() 
相關問題