我正在编写一个简短的程序,它接受用户输入的 *csv 文件并将其作为 pandas DataFrame 进行操作。
用户必须输入带有必填列的 *csv A1
和B2
(包括/不包括可选列)或必需列 C3
和D4
(包括/不包括可选列)。如果A1
作为一列存在,则 B2
必须作为列存在,否则会引发错误(反之亦然)。与 C3
相同和D4
。用户可以选择任意一对,但他们必须做出选择。
给出一个示例数据框:
import pandas as pd
df = pd.DataFrame("example1.csv")
我可以单独检查列对必须都存在,如下所示,或者使用 pandas:
if df.columns.isin(['A1', 'B2']).any():
raise ValueError("Both A1 and B2 must be included")
或使用 .issubset()
如:
if not {'A1', 'B2'}.issubset(df.columns):
raise ValueError("Both A1 and B2 must be included")
我的问题是如何将所有这些条件组合在一起而不创建意大利面条式代码。
如果 A、B、C、D 均未找到,则抛出错误。如果找到,则检查是否有合作伙伴;如果找不到所需的伙伴,则抛出错误...(但如果 A、B、C 存在而 D 不存在,则此操作将失败,而我选择 C 来查找配对...)
最佳答案
创建配对列表 -
pairs = {('A1', 'B2'), ('C3', 'D4')}
从你的帖子来看,似乎任何一对存在就足够了。在这种情况下,您可以使用 any
和 all
的组合来执行此操作 -
if not any(any(x in df for x in p) and all(x in df for x in p) for p in pairs):
raise ValueError("No valid pairs contained in `df`")
这大致可以翻译为:
for p in pairs:
if any(x in df for x in p) and all(x in df for x in p):
break
else:
raise ValueError("No valid pairs contained in `df`")
关于python - 要求 pandas 数据帧输入有两个列对或抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796932/