2017-08-02 156 views
3

我用下面的代码使用熊猫read_csv熊猫:处理缺失列

headers = ["1","2","3","4","5"] 
fields = ["1", "5"] 

for chunk in pandas.read_csv(fileName, names=headers, header=0, usecols=fields, chunksize=chunkSize): 

有时我的CSV不会有列“5”读取数据块的CSV文件,我希望能够处理这种情况并指定一些默认值。有没有办法只读取我的CSV文件的标题而不读取整个文件,以便我可以手动处理?或者可能是其他聪明的方式来默认缺失列的值?

+1

可能集'error_bad_lines = FALSE'。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ事情是我需要为每行的列“5”的值,但有时整个列“5”将丢失,所以我必须回退到默认值。 error_bad_lines = False会忽略该行,不是? –

+0

是的,你是对的。不知道这个。我一直认为熊猫会默认填充NaN。 –

回答

1

如果你通过nrows=0此读取刚刚列列,你可以调用intersection找到共同的列值,并避免任何错误:

In[14]: 
t="""1,2,3,5,6 
0,1,2,3,4""" 
headers = ["1","2","3","4","5"] 
fields = ["1", "5"] 
cols = pd.read_csv(io.StringIO(t), nrows=0).columns 
cols 

Out[14]: Index(['1', '2', '3', '5', '6'], dtype='object') 

所以现在我们有列名,我们可以调用intersection找到对你的预期与实际列的有效列:

In[15]: 
valid_cols = cols.intersection(headers) 
valid_cols 

Out[15]: Index(['1', '2', '3', '5'], dtype='object') 

你可以做同样的fields然后你就可以通过这些到您当前密码,以避免任何异常

只是为了证明,经过nrows=0只是读标题行:

In[16]: 
pd.read_csv(io.StringIO(t), nrows=0) 

Out[16]: 
Empty DataFrame 
Columns: [1, 2, 3, 5, 6] 
Index: [] 
+0

是的我只是发现了关于nrows,但我正要测试它与nrows = 1,不知道计数从0开始(应该猜到)我会试试看,谢谢! –

+0

是的,你可以做到这一点并不明显,将会更新以证明这一点 – EdChum