我有一个相当大的数据帧(几百列),我想对它执行以下操作。我在下面用一个玩具数据框和一个简单的条件来说明我需要什么。
对于每一行:条件#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的所有列,因为有几百个。这就是为什么我使用过滤。
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
,根据条件将其设置为True
或False
,然后返回它。
然后你可以使用你的函数使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
我将要做的事
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将被修改为 我该如何选择性地做到这一点? 问题答案: 您也可以根据需要使用该条件。