Pandas 根据条件过滤行,但始终保留第一行。

3
我希望能够删除符合某些条件的行,但即使第一行符合该条件,我也不想删除第一行。
我尝试使用df.drop函数来删除行,但如果第一行满足该条件,它会擦除第一行。我不想要那样。
数据类似于这样:
Column1 Column2 Column3
  1        3      A
  2        1      B
  3        3      C
  4        1      D
  5        1      E
  6        3      F

我希望以一种方式进行操作,如果某一行在第二列中有一个值为3,则删除该行。
删除后的新数据应如下所示(即使第一行在第二列中有一个值为3,也要保留第一行):
Column1 Column2 Column3
  1        3      A
  2        1      B
  4        1      D
  5        1      E
3个回答

2
你可以将“保留第一行”作为删除/保留行的条件之一。
保留行的条件应为<原始条件>或<保留第一行的条件>。在代码中,这样写:
# (condition to drop 3) | (condition to keep 0th row)
df[(df['Column2'] != 3) | (df.index == 0)]

   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E

相反地,使用DeMorgan定律,删除行的条件将会是(df['Column2'] == 3) & (df.index != 0)。我们然后反转该条件以获得期望的输出结果,即"最初的回答"。

df[~((df['Column2'] == 3) & (df.index != 0))]

   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E

这些代码适用于你的索引是一个RangeIndex的情况。如果不是,可以使用pd.RangeIndex(len(df)) == 0作为第二个条件。"最初的回答"

谢谢您的回答。可以再问一个问题吗?假设我在第二列中有其他值,那么我只想保留1并删除任何其他值(不仅仅是3,还有2、4、5、6、7等等)。 - cck1110
1
@cck1110 你可以使用 isin。更多信息请参见这里 - cs95
1
@cck1110 如果只想保留1,你也可以将条件写为 df[(df['Column2'] == 1) | (df.index == 0)] - cs95
我尝试了这个方法 df[(df['Column2'] == 1) | (df.index == 0)],但如果第一行[column2]的值为“2”,则它也会删除该第一行。 - cck1110
1
@cck1110 我尝试了完全相同的操作,对我来说是有效的。也许你的索引不同。请尝试:df2 = df[(df['Column2'] == 1) | (pd.RangeIndex(len(df)) == 0)] - cs95
1
@cck1110 哈!我就知道。那个答案早就在我的回答里了。下次一定要仔细阅读我的回答 :p - cs95

2
我正在使用“duplicated”库。原始答案翻译成中文为“最初的回答”。
df[(~df.Column2.duplicated())|df.Column2.ne(3)]
   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E

2

这里已经有很好的回答了,但为了方便您,我们也可以使用cumcount来排名第3个Nth




df = df[~((df.groupby('Column2').Column2.cumcount() != 0) & (df.Column2 == 3))]

print(df)
   Column1  Column2 Column3
0        1        3       A
1        2        1       B
3        4        1       D
4        5        1       E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接