要求 pandas 数据框输入有两列对或抛出错误
Requiring pandas dataframe input has either two column pairs or error thrown
我正在编写一个简短的程序,它接受用户输入的 *csv 文件并将其作为 pandas DataFrame 进行操作。
用户必须输入包含必填列 A1
和 B2
(including/without 可选列)或必填列 C3
和 D4
(including/without 可选列)。如果 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 来查找配对,这将失败...)
您可以创建包含列对的列表列表,遍历它并检查您的条件:
col_pairs = [['A1', 'B2'], ['C3', 'D4']]
for pair in col_pairs:
if set(pair).intersection(df.colums) and not set(pair).issubset(df.columns):
raise ValueError("Both {col1} and {col2} must be included".format(col1=pair[0], col2=pair[1]))
创建配对列表 -
pairs = {('A1', 'B2'), ('C3', 'D4')}
从你的post来看,似乎任何一对都存在就足够了。在这种情况下,您可以使用 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`")
我正在编写一个简短的程序,它接受用户输入的 *csv 文件并将其作为 pandas DataFrame 进行操作。
用户必须输入包含必填列 A1
和 B2
(including/without 可选列)或必填列 C3
和 D4
(including/without 可选列)。如果 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 来查找配对,这将失败...)
您可以创建包含列对的列表列表,遍历它并检查您的条件:
col_pairs = [['A1', 'B2'], ['C3', 'D4']]
for pair in col_pairs:
if set(pair).intersection(df.colums) and not set(pair).issubset(df.columns):
raise ValueError("Both {col1} and {col2} must be included".format(col1=pair[0], col2=pair[1]))
创建配对列表 -
pairs = {('A1', 'B2'), ('C3', 'D4')}
从你的post来看,似乎任何一对都存在就足够了。在这种情况下,您可以使用 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`")