python - 要求 pandas 数据帧输入有两个列对或抛出错误

标签 python pandas csv conditional-statements

我正在编写一个简短的程序,它接受用户输入的 *csv 文件并将其作为 pandas DataFrame 进行操作。

用户必须输入带有必填列的 *csv A1B2 (包括/不包括可选列)或必需列 C3D4 (包括/不包括可选列)。如果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')}

从你的帖子来看,似乎任何一对存在就足够了。在这种情况下,您可以使用 anyall 的组合来执行此操作 -

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/

相关文章:

javascript - 如何访问 JavaScript 事件回调函数中的变量?

python - Python 中的 SSL : Why it doesn't send certificate to server?

python - 在 iPython 修剪输出中解释 {isinstance}?

python - 使用 Python 对 CSV 文件中的列进行乘法/除法

vba - 使用加载项中的宏时保存事件工作簿

python - Pandas 使用 0.21.0 对 FutureWarning 进行切片

python - 我们可以在 .NET ironpython 中加载 pandas DataFrame 吗?

python - 根据 pandas 时间序列图中的某些因素更改标记

python - 将值与列索引 pandas 匹配

python - Pandas 阅读html表格