【问题标题】:Multiple outcomes from numpy where statementnumpy where 语句的多个结果
【发布时间】:2021-05-03 12:55:21
【问题描述】:

我有一个 4 列的 excel 表,(列 1、2、3、4)。

列中的数据是二进制 1 或 0。但是,有时列中会有 X。当 X 出现在某一列的某一行时,它将出现在该行的所有列中。

我要做的是按行对所有列进行求和,并将其归为通过、失败或 X 状态。

各行的最大总和可以是 4,如果是 4 则为失败。 如果小于 4 则通过。 如果它是 X,我希望它在新创建的 df 中保留为 X

What i have done is:
criteria = df['Column 1'] + df['Column 2'] + df['Column 3 '] + df['Column 4']
df['criteria'] = np.where(criteria == 4, 'Fail', 'Pass')

问题在于这会将 X 标记为通过。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    首先,在代码中添加所有值。 这不会按您的意愿工作,因为所有值都可能是字符串,或者更糟糕的是,整数和字符串的组合。 这将返回一个字符串,或者引发一个TypeError

    此后,df['Column 1']df['Column 2']df['Column 3']df['Column 4'] 的值被视为字符串。 (如果还没有,您可能需要将它们转换为字符串)

    首先,在df 列中找到“X”,如果是,则将df['criteria'] 设置为'X'

    其次,将字符串转换为数字并相加,然后与4进行比较。

    使用这个:

    # make `np.array` of the concerned columns
    slice = np.array((
        df['Column 1'], df['Column 2'], df['Column 3'], df['Column 4']
    ))
    
    # `slice` is a transpose of `df`, so transpose again to make it same
    slice = np.transpose(slice)
    
    for i in range(len(slice)):
        row = slice[i]
        if np.array(np.where(row == 'X')).size > 0:
            df['criteria'][i] = 'X'
        else:
            row = row.astype('int')
            if sum(row) == 4:
                df['criteria'][i] = 'Fail'
            elif sum(row) < 4:
                df['criteria'][i] = 'Pass'
    

    注意事项:

    • 这假定名为“条件”的列已经存在并且具有适当的大小来存储所有值。
    • 有关for 循环(第11 行)中第一个if 语句的更多信息,请参阅How can I check whether a numpy array is empty or not?
    • 此代码已使用以下值df 进行了测试
      # Note: This `DataFrame` looks different.
      # Note: The columns are horizontal instead of vertical
      df = pd.DataFrame.from_dict(data={
          'Column 1': ['0', '1', 'X', '1'],
          'Column 2': ['1', '1', 'X', '1'],
          'Column 3': ['0', '1', 'X', '0'],
          'Column 4': ['0', '1', 'X', '1'],
          'Expected': ['Pass', 'Fail', 'X', 'Pass'],
          'criteria': ['', '', '', '']
      }, dtype='str')
      
      预期结果 (df['Expected']) 匹配 df['criteria']

    【讨论】:

    • 你测试过这个吗?我希望它会抛出错误。
    • @fountainhead,是的,我有。我也提供了一些关于它的注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多