我想删除一些满足特定条件的行,但即使第一行符合该条件,我也不想删除第一行。
我尝试使用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
您可以将“保留第一行”作为删除/保留行的条件的一部分。
保持行的条件是<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
反过来,使用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
作为第二个条件。
我正在使用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
这里已经发布了很好的答案,但为了您的方便。我们也可以使用cumcount
来排列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