【问题标题】:Validating dataframe column data验证数据框列数据
【发布时间】:2019-05-02 09:26:00
【问题描述】:

我有一个下面的伪代码,我需要使用 pandas 编写。

if group_min_size && group_max_size
      if group_min_size == 0 && group_max_size > 0
        if group_max_size >= 2
          errors.add(:group_min_size, "must be greater than or equal to 2 and less than or equal to group_max_size (#{group_max_size})")
        end

        if group_max_size < 2
          errors.add(:group_min_size, "must be greater than 2")
          errors.add(:group_max_size, "must be greater than 2")
        end
      end

      if group_min_size > 0 && group_max_size == 0
        if group_min_size >= 2
          errors.add(:group_max_size, "must be greater than or equal to #{group_min_size}")
        end

        if group_min_size < 2
          errors.add(:group_min_size, "must be greater than 2")
          errors.add(:group_max_size, "must be greater than 2")
        end
      end
    end

我试图分解成更小的部分并写下类似下面的内容-

m8 = ((~df['group_min_size'].notna() & ~df['group_min_size'].notna()) | ((~df['group_min_size'] == 0) & (~df['group_max_size'] > 2)) | (df['group_max_size'] >= 2)) 

这是给

if group_min_size == 0 && group_max_size > 0
        if group_max_size >= 2
          errors.add(:group_min_size, "must be greater than or equal to 2 and less than or equal to group_max_size (#{group_max_size})")
        end

但没有按预期工作。

下面是我的测试数据——

   group_min_size  group_max_size
0             0.0             1.0
1            10.0            20.0
2             0.0             3.0
3             3.0             0.0
4             NaN             NaN
5             2.0             2.0
6             2.0             2.0
7             2.0             2.0
8             2.0             2.0

根据伪代码逻辑,输出应该是:

False
True 
False
False
True
True
True
True
True

如何在 pandas 中编写这个逻辑?

【问题讨论】:

  • @MohamedThasinah 我已经提到了我尝试过的内容。打破不同的 ifs 。并提供了代码实现
  • 第四个也是真的

标签: python pandas dataframe


【解决方案1】:

一步一步回答你的问题。首先创建您的布尔值:

min_equal_0 = df['group_min_size'] == 0
min_above_0 = df['group_min_size'] > 0
min_above_equal_2 = df['group_min_size'] >= 2
min_below_2 = df['group_min_size'] < 2

max_equal_0 = df['group_max_size'] == 0
max_above_0 = df['group_max_size'] > 0
max_above_equal_2 = df['group_max_size'] >= 2
max_below_2 = df['group_max_size'] < 2

现在我们可以看看根据伪代码创建我们的掩码了:

first_mask = ~(min_equal_0 & max_above_0 & (max_below_2 | max_above_equal_2))
second_mask = ~(max_equal_0 & min_above_0 & (min_below_2 | min_above_equal_2))

如果我们将两者结合起来:

>> first_mask & second_mask

0    False
1     True
2    False
3    False
4     True
5     True
6     True
7     True
8     True
dtype: bool

如果您想将NaN 视为False,只需添加它们:

min_is_not_null = df['group_min_size'].notnull()
max_is_not_null = df['group_max_size'].notnull()
>> min_is_not_null & max_is_not_null & first_mask & second_mask
0    False
1     True
2    False
3    False
4    False
5     True
6     True
7     True
8     True
dtype: bool

【讨论】:

  • 感谢您的解释。我试图将所有内容合二为一。这对我来说真的太复杂了。我将从这种方法开始进行任何进一步的验证。
  • np!编写伪代码很好,但我认为嵌套 IF 语句的事实让人感到困惑。
猜你喜欢
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多