这是在阅读
.csv
文件的情况下。我想要一组 pandas 将读取和解析的“必需”列,以及一组 pandas 将提取的“可选”列(如果它位于 .csv
文件中,否则不会提取它(我正在循环)通过许多不同的 .csv
文件,只想获得满足这些条件的文件)。
假设我有以下数据:
必填_col1 | 必填_col2 | 可选_col1 | 可选_col2 | |
---|---|---|---|---|
0 | 1 | 4 | a | d |
1 | 2 | 5 | b | e |
2 | 3 | 6 | c | f |
我希望 pandas 要求数据集具有
required_col1
、required_col2
,如果 optional_col1
在数据集中,则读取它,如果不在,则不要引发错误并继续; optional_col2
应该是一样的。但是,如果所需的列不在数据集中,我希望 pandas 引发错误。
我尝试使用
lambda
函数:
columnsList = ['required_col1', 'required_col2', 'optional_col1', 'optional_col2']
data = pd.read_csv('file.csv', usecols=lambda x: x in columnsList)
但是,这不起作用,因为它将 all 列表值视为可选 - 因此,如果数据集具有“可选_col1”和“必需_col2”,它仍然会运行而不会引发错误(即使“必需_col1”不在其中)数据)。
我什至尝试过这个:
optionalList = ['optional_col1', 'optional_col2']
columnsList = ['required_col1', 'required_col2', lambda x: x in optionalList]
data = pd.read_csv('file.csv', usecols=columnsList)
但是,我什至不知道这在 Python 级别上是否有意义,因为我不确定在运行它时是否会访问 lambda 函数(我尝试时不是)。
有没有什么方法可以让 pandas 提取可选列(如果有),但也有一组它always应该从数据集中提取的列?谢谢——我感谢所有的帮助!
我仍然不确定这个具体问题是否在 pandas API 的范围内有答案,但我已经找到了解决问题的方法。我在评论中提到,我正在尝试在运行此条件的不同数据集中运行 for 循环读取
usecols
。
正如 @Michael S. 建议的那样,
try
和 except
是通往这里的方法。
首先,使用 required 列运行数据集,然后将数据集名称附加到列表中。
# list of required columns
requiredList = ['required_col1', 'required_col2']
finalDatasets = []
for i, dataName in enumerate(database)):
try:
data = pd.read_csv(dataName, usecols=requiredList)
except:
continue
else:
finalDatasets.append(dataName)
由于这个新列表已经删除了没有所需列的数据集,您现在可以运行
lambda
函数来解析可选列:
columnsList = ['required_col1', 'required_col2', 'optional_col1', 'optional_col2']
for i, dataName in enumerate(finalDatasets):
# read in data
try:
data = pd.read_csv(dataName, usecols=lambda x: x in columnsList)
except:
continue
else:
{insert analysis}
这样,您就可以解析具有所需列的数据集,但您不确定它们是否具有可选列(这就是lambda
派上用场的地方)。
lambda
就是要走的路。您可以从一开始就使用
try...except
,而不是
lambda
,如果未找到所有必需的列,则提出
Exception
,例如
import io
import numpy as np
csv_io = io.StringIO("required_col1,required_col2,optional_col1,other_col1\n1,2,3,4")
required_cols = ['required_col1', 'required_col2']
optional_cols = ['optional_col1', 'optional_col2']
data = pd.read_csv(csv_io, usecols=lambda x: x in required_cols + optional_cols)
assert np.isin(required_cols, data.columns).all()