Pandas read_csv usecols接受不存在的列名

Pla*_*sma 3 python pandas

是否有可能制造熊猫.如果在输入文件中找不到usecols中指定的列,read_csv()会引发错误吗?例如,在下面的示例中,我希望Pandas引发异常,因为输入文件中没有名为"hello"的列:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

col1 col2 col3
one  two  NaN
Run Code Online (Sandbox Code Playgroud)

所以Pandas读取文件中的第三列名称("col3")并用NaN填充它,而不是引发"hello"不存在的错误.我希望在阅读文件时得到通知,而不是在将文件读入内存后验证文件内容.

EdC*_*ica 10

您可以只读取标题并使用以下方法测试是否存在所有预期的列名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)
Run Code Online (Sandbox Code Playgroud)

您可以all用来测试是否存在所有cols:

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

Out[11]:
False
Run Code Online (Sandbox Code Playgroud)

另外你可以反转掩码找到缺少的col:

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

Out[18]:
array(['hello'], 
      dtype='<U5')
Run Code Online (Sandbox Code Playgroud)

您可以将此逻辑放在用户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()
Run Code Online (Sandbox Code Playgroud)