是否可以制作Pandas。read_csv()如果在输入文件中找不到usecols中指定的列,则会引发错误?例如。在下面的示例中,我希望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)
输出:
col1 col2 col3
one two NaN
所以Pandas读取文件中的第三个列名(" col3")并用NaN填充它,而不是引发错误" hello"不存在。我希望在阅读文件时得到通知,而不是在将文件内容读入内存后验证文件内容。
答案 0 :(得分: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
来测试是否存在所有列:
In [11]:
df.columns.isin(cols).all()
Out[11]:
False
另外,您可以反转蒙版以找到缺少的col:
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()