当前位置: 首页 > 知识库问答 >
问题:

根据两个相关条件删除数据帧行

周奇
2023-03-14

我有一个相当大的数据帧(几百列),我想对它执行以下操作。我在下面用一个玩具数据框和一个简单的条件来说明我需要什么。

对于每一行:条件#1:检查其中两列的值是否为零(0)。如果这是真的,请保留该行并继续下一行。如果任一列的值为零(0),则条件为真。

如果条件#1为False(第1列或第4列中没有零),请检查行中所有剩余的列。如果任何剩余列的值为零,则删除该行。

我希望过滤后的数据帧作为一个新的、独立的数据帧返回。

到目前为止我的代码:

# https://codereview.stackexchange.com/questions/185389/dropping-rows-from-a-pandas-dataframe-where-some-of-the-columns-have-value-0/185390
# https://thispointer.com/python-pandas-how-to-drop-rows-in-dataframe-by-conditions-on-column-values/
# https://stackoverflow.com/questions/29763620/how-to-select-all-columns-except-one-column-in-pandas

import pandas as pd

df = pd.DataFrame({'Col1': [7, 6, 0, 1, 8],
                   'Col2': [0.5, 0.5, 0, 0, 7],
                   'Col3': [0, 0, 3, 3, 6],
                   'Col4': [7, 0, 6, 4, 5]})

print(df)
print()

exclude = ['Col1', 'Col4']
all_but_1_and_4 = df[df.columns.difference(exclude)]        # Filter out columns 1 and 4
print(all_but_1_and_4)
print()


def delete_rows(row):
    if row['Col1'] == 0 or row['Col4'] == 0:    # Is the value in either Col1 or Col4 zero(0)
        skip = True                             # If it is, keep the row
        if not skip:                            # If not, check the second condition
            is_zero = all_but_1_and_4.apply(lambda x: 0 in x.values, axis=1).any()      # Are any values in the remaining columns zero(0)
            if is_zero:                         # If any of the remaining columns has a value of zero(0)
                pass
                # drop the row being analyzed   # Drop the row.


new_df = df.apply(delete_rows, axis=1)
print(new_df)

如果我的两个条件都满足,我不知道如何真正放弃这一行。

在我的玩具数据框中,应该保留第1、2和4行,删除第0和第3行。

我不想手动检查步骤2的所有列,因为有几百个。这就是为什么我使用过滤。

共有2个答案

傅啸
2023-03-14

WeNYoBen的答案非常好,所以我只显示代码中的错误:

>

  • 以下if语句中的条件永远不会满足:

        skip = True                             # If it is, keep the row
        if not skip:                            # If not, check the second condition
    

    您可能想要取消以下行的缩进,例如

        skip = True                             # If it is, keep the row
    if not skip:                            # If not, check the second condition
    

    这与简单的else:相同,不需要skip=True

    else:                            # If not, check the second condition
    

    如果整个表中至少有一个值为零,则以下if语句中的条件将始终满足(因此,正如您所设想的,不仅是当前行中的值):

        is_zero = all_but_1_and_4.apply(lambda x: 0 in x.values, axis=1).any()      # Are any values in the remaining columns zero(0)
        if is_zero:                         # If any of the remaining columns has a value of zero(0)
    

    因为all_but_1_and_4.apply(lambda x: 0在x.values,轴=1)是一系列的True/False值-在all_but_1_and_4表中的每行一个。因此,在应用. any()方法之后,您将收到我所说的内容。

    注:

    你的方法还不错,你可以在你的函数中添加一个变量dropThisRow,根据条件将其设置为TrueFalse,然后返回它。
    然后你可以使用你的函数使true/False系列,并将其用于创建目标表:

    dropRows = df.apply(delete_rows, axis=1)   # True/False for dropping/keeping - for every row
    new_df = df[~dropRows]                     # Select only rows with False
    

  • 苏涵润
    2023-03-14

    我将要做的事

    s1=df[exclude].eq(0).any(1)
    s2=df[df.columns.difference(exclude)].eq(0).any(1)
    
    ~(~s1&s2) #s1 | ~s2
    Out[97]: 
    0    False
    1     True
    2     True
    3    False
    4     True
    dtype: bool
    yourdf=df[s1 | ~s2].copy()
    
     类似资料:
    • 问题内容: 我想获取基于条件选择的数据帧行数。我尝试了以下代码。 输出: 输出显示数据帧中每一列的计数。相反,我需要获得满足以上所有条件的单一计数?这该怎么做?如果您需要有关我的数据框的更多说明,请告诉我。 问题答案: 您要的是所有条件都为真的条件,所以答案是len,除非我误解了您的要求

    • 问题内容: 有没有一种方法可以对 field1 = x* 和 field2 = y的文档执行删除操作 ? *** 我看到了删除功能,但没有附带。如果使用事务,则存在get和delete,但get似乎不接受“ where”子句。 我希望我在文档中缺少一些内容。 谢谢 问题答案: 为此,您需要先创建所需的查询,然后才使用如下方法:

    • 让我们假设我的数据frame如下所示: 我有一个的列表,我想从Dataframe中删除它们。该列表超过200个长度,因此多个筛选器太麻烦了。 是否可以通过传递的列表来进行筛选?

    • 问题内容: 当日期列的值在日期列表中时,我想从熊猫数据框中删除行。以下代码不起作用: 我收到以下错误: ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 问题答案: 您可以使用。 将返回布尔值,具体取决于每个元素是否在列表内。然后,您可以将转换为,反之亦然。

    • 我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘

    • 问题内容: 我有一个清单清单: 我想从列表中删除所有不满足条件的元素。 因此,如果我想删除与之相对应的元素。 所以list_1将被修改为 我该如何选择性地做到这一点? 问题答案: 您也可以根据需要使用该条件。