熊猫会根据条件过滤行,但始终保留第一行

时间:2019-03-28 01:07:55

标签: python pandas dataframe

我想删除一些满足某些条件的行,但是即使第一行符合该条件,我也不想删除第一行。

我尝试使用df.drop函数删除行,但是如果第一行满足该条件,它将删除第一行。我不要那个。

数据看起来像这样:

Column1 Column2 Column3
  1        3      A
  2        1      B
  3        3      C
  4        1      D
  5        1      E
  6        3      F

我想以一种方式来执行此操作:如果某行在column2中的值为3,则将其删除。

我希望新数据是这样的(删除后,即使第一行在第2列中的值为3,也保留第一个):

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

3 个答案:

答案 0 :(得分:2)

您可以将“保留第一行”作为删除/保留行的条件之一。

保留行的条件为<ORIGINAL CONDITION> or <CONDITION TO KEEP FIRST ROW>。在代码中,这是

# (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

相反,使用德摩根定律,删除行的条件为(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 :(得分: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 :(得分:2)

已经在这里发布了很好的答案,但是只是为了您的方便。我们还可以使用http://www.labbookpages.co.uk/audio/javaWavFiles.html来对Nth 3进行排名,我们发现:

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