有没有办法在 pandas 中使用 usecols 读取必填和可选列?

问题描述 投票:0回答:2

这是在阅读

.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应该从数据集中提取的列?谢谢——我感谢所有的帮助!

python pandas csv
2个回答
1
投票

我仍然不确定这个具体问题是否在 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

派上用场的地方)。


0
投票
这个问题的答案很晚,但我也有同样的问题,

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()
    
© www.soinside.com 2019 - 2024. All rights reserved.