【问题标题】:Requiring pandas dataframe input has either two column pairs or error thrown要求熊猫数据框输入有两列对或抛出错误
【发布时间】:2018-05-27 13:46:01
【问题描述】:

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

用户必须输入带有必填列A1B2(包括/不包括可选列)或必填列C3D4(包括/不包括可选列)的*csv。如果A1 作为列存在,则B2 必须作为列存在,否则会引发错误(反之亦然)。与C3D4 相同。允许用户选择任何一对,但他们必须选择。

给定一个示例数据框:

import pandas as pd
df = pd.DataFrame("example1.csv")

我可以单独检查列对必须都存在如下,或者使用熊猫:

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 ​​来查找配对...)

【问题讨论】:

  • 您的第一种方法没有按您的预期工作。然而,第二个确实如此。
  • 一旦满足if df.columns.isin(['A1', 'B2']).any(): 语句,如何使用try..except 块检查第二列..
  • 另外,用户选择什么? CSV 还是列对?他们可以选择 D 或 C 还是只选择 C?
  • @cᴏʟᴅsᴘᴇᴇᴅ 我上面不清楚:用户输入 *csv。他们创建了 *csv。如果他们创建不正确(不包括强制列对),则一定有错误
  • 好的。因此,您不知道 CSV 包含哪些对,因此您想检查每个列对。正确的?如果 CSV 有 A 和 B,C 但没有 D,该怎么办?它应该成功还是失败?

标签: python pandas csv conditional


【解决方案1】:

您可以使用列对创建列表列表,循环遍历它并检查您的条件:

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]))

【讨论】:

  • 对不起,any(pair) in df必须是set(pair).intersection(df.colums)
  • format(col1=pair[0], col2=pair[1])) 会真正为用户提供所需的正确配对吗?可能是A1B2C3D4,对吗?
  • 它将为用户提供遇到的第一个问题对。
【解决方案2】:

创建对列表 -

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`") 

【讨论】:

  • x这里有一个专栏?
  • @ShanZhengYang 确实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2018-11-19
相关资源
最近更新 更多