【问题标题】:Python Dataframe: How to check specific columns for elementsPython Dataframe:如何检查元素的特定列
【发布时间】:2021-04-16 10:59:50
【问题描述】:

我想检查某一列的所有元素是否都包含数字0?

我有一个使用df=pd.read_table('ad-data')读取的数据集
从这里我感觉到了一个带有元素的数据框

[0] [1.] [2] [3] [4] [5] [6] [7] ....1559

[1.]  3   2   3   0   0   0   0

[2]  2   3   2   0   0   0   0

[3]  3   2   2   0   0   0   0

[4]  6   7   3   0   0   0   0

[5]  3   2   1   0   0   0   0

...
3220

我想检查从第 4 列到第 1559 列的数据集是否只包含 0 或其他值。

【问题讨论】:

    标签: python pandas dataframe numpy exists


    【解决方案1】:

    您可以使用 0 元素来检查相等性并使用 all 表示行:

    df['all_zeros'] = (df.iloc[:, 4:1560] == 0).all(axis=1)
    

    演示它的小例子(基于此处的第 1 到 3 列):

    N = 5
    df = pd.DataFrame(np.random.binomial(1, 0.4, size=(N, N)))
    df['all_zeros'] = (df.iloc[:, 1:4] == 0).all(axis=1)
    df
    

    输出:

       0  1  2  3  4  all_zeros
    0  0  1  1  0  0      False
    1  0  0  1  1  1      False
    2  0  1  1  0  0      False
    3  0  0  0  0  0       True
    4  1  0  0  0  0       True
    

    更新:过滤非零值:

    df[~df['all_zeros']]
    

    输出:

       0  1  2  3  4  all_zeros
    0  0  1  1  0  0      False
    1  0  0  1  1  1      False
    2  0  1  1  0  0      False
    

    更新 2:仅显示非零值:

    pd.melt(
        df_filtered.iloc[:, 1:4].reset_index(),
        id_vars='index', var_name='column'
    ).query('value != 0').sort_values('index')
    

    输出:

       index column  value
    0      0      1      1
    3      0      2      1
    4      1      2      1
    7      1      3      1
    2      2      1      1
    5      2      2      1
    

    【讨论】:

    • 非常感谢,我会试试的。我如何打印这些信息
    • 我得到了错误:无法使用这些 int 类型的索引器 [4] 对索引进行切片索引
    • 那么您的列名可能是字符串。如果它们从 0 开始并且按升序排列,您可以尝试将 .loc 替换为 .iloc,这将不是根据它们的名称而是根据它们的索引来查找列。我已更新答案以使用 .iloc
    • 哇,谢谢,谢谢,我现在收到了错误的值。现在可以输出非零了吗?
    • 你的意思是只过滤那些至少有一个非零值的,对吧?类似df_filtered = df[~df['all_zeros']]
    【解决方案2】:
    df['Check']=df.loc[:,4:].sum(axis=1)
    

    【讨论】:

    • @DimaGraf 是的,它从第 4 列到最后。
    【解决方案3】:

    这是检查所有值是否为零的方法:很简单 并且不需要高级功能如上述答案。只有基本的 过滤、if 循环和变量分配等功能。

    首先是检查一列是否只有零的方法,并且 第二个是如何查找所有列是否都为零。它 打印和回答声明。

    检查一列是否只有零值的方法:

    先做一个系列:

     has_zero = df[4] == 0
     # has_zero is a series which contains bool values for each row eg. True, False.
     # if there is a zero in a row it result will be "row_number : True"
    

    下一个:

    rows_which_have_zero = df[has_zero]
    # stores the rows which have zero as a data frame 
    

    下一个:

    if len[rows_which_have_zero] == total_number_rows:
        print("contains only zeros")
    else: 
        print("contains other numbers than zero")
    # substitute total_number_rows for 3220 
    

    上述方法只检查 rows_which_have_zero 是否等于列中的行数。

    查看所有列是否只有零的方法:

    它使用上述函数并将其放入 if 循环中。

    no_of_columns = 1559
    value_1 = 1
    
    if value_1 <= 1559
         has_zero = df[value_1] == 0
         rows_which_have_zero = df[has_zero]
         value_1 += 1
         if len[rows_which_have_zero] == 1559 
             no_of_rows_with_only_zero += 1
         else:
             return
    

    检查所有行是否只有零:

       #since it doesn't matter if first 3 columns have zero or not:
       no_of_rows_with_only_zero = no_of_rows_with_only_zero - 3
       if no_of_rows_with_only_zero == 1559:
           print("there are only zero values")
       else:
           print("there are numbers which are not zero")
    

    上面检查 no_of_rows_with_only_zero 是否等于行数(即 1559 减去 3,因为只需要检查第 4 - 1559 行)

    更新:

      # convert the value_1 to str if the column title is a str instead of int 
      # when updating value_1 by adding: convert it back to int and then back to str 
    

    【讨论】:

    • 注意:此答案仅使用简单的功能,并且可以通过使用上述答案等高级功能来缩短此代码
    • 另请注意:代码检查第一列时可能会出错,因为该列的标题为 [1.],末尾有一个点。所以为了避免错误 - 将列标题重命名为 [1] 或更新上面的代码,使其不检查第一列
    猜你喜欢
    • 2021-09-25
    • 2015-12-27
    • 2018-11-15
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多