如何从pandas数据框中删除特定行?

时间:2017-03-23 19:13:10

标签: python pandas dataframe rows

我正在处理一个pandas数据框,如下所示。

    id          x1          y1
 0  2           some_val    some_val
 1  2           some_val    some_val
 2  2           some_val    some_val
 3  2           some_val    some_val
 4  2           some_val    some_val
 5  0           0           0 
 6  3           some_val    some_val
 7  3           some_val    some_val
 8  0           0           0 
 9  5           some_val    some_val
10  5           some_val    some_val
11  5           some_val    some_val
12  0           0           0
13  6           some_val    some_val
14  6           some_val    some_val
15  6           some_val    some_val
16  6           some_val    some_val

我的原始数据框是数据框,没有所有' 0'值。根据项目要求,每当" id"时,我必须插入具有全0值的行。变化。

现在我要删除任何" id"的所有行它有3行,少于3行。从上面的数据框架中,我想删除所有相应的id-" 3"和" 5" 。我的结果数据框应如下所示:

   id          x1          y1
0  2           some_val    some_val
1  2           some_val    some_val
2  2           some_val    some_val
3  2           some_val    some_val
4  2           some_val    some_val
5  0           0           0
6  6           some_val    some_val
7  6           some_val    some_val
8  6           some_val    some_val
9  6           some_val    some_val

请告诉我一种获得此结果的方法。

3 个答案:

答案 0 :(得分:1)

假设您的DataFrame名称是df,您需要执行以下操作:

df = df[df['col'<>=condition]] 

特别针对您的情况:

df = df[df['ProjID'!=3]] 

与5.相同。您可以将两个过滤器与'和'组合以提高效率。

这称为DataFrame索引过滤器。

答案 1 :(得分:1)

最简单的答案是删除零行,因为如果你有超过3行,它们可能会妨碍计算。然后做一组。然后过滤。然后像你在其他问题/答案中那样添加回零

d1 = df.query('ProjID != 0').groupby('ProjID').filter(lambda df: len(df) > 3)
d1

    ProjID     Xcoord    Ycoord
0        2  -7.863509  5.221327
1        2   some_val  some_val
2        2   some_val  some_val
3        2   some_val  some_val
4        2   some_val  some_val
13       6   some_val  some_val
14       6   some_val  some_val
15       6   some_val  some_val
16       6   some_val  some_val

然后加回

pidv = d1.ProjID.values
pid_chg = np.append(pidv[:-1] != pidv[1:], True)

i = d1.index.repeat(pid_chg + 1)

d2 = d1.loc[i, :].copy()

d2.loc[i.duplicated()] = 0

d2.reset_index(drop=True)

    ProjID     Xcoord    Ycoord
0        2  -7.863509  5.221327
1        2   some_val  some_val
2        2   some_val  some_val
3        2   some_val  some_val
4        2   some_val  some_val
5        0          0         0
6        6   some_val  some_val
7        6   some_val  some_val
8        6   some_val  some_val
9        6   some_val  some_val
10       0          0         0

答案 2 :(得分:0)

您可以使用groupby并过滤小于3的ID,并使用结果列表来索引df。

filtered = df.groupby('ProjID').Xcoord.filter(lambda x: x.count() > 3)
df.iloc[filtered.index.tolist()]


    ProjID  Xcoord  Ycoord
0   2   -7.863509   5.221327
1   2   some_val    some_val
2   2   some_val    some_val
3   2   some_val    some_val
4   2   some_val    some_val
13  6   some_val    some_val
14  6   some_val    some_val
15  6   some_val    some_val
16  6   some_val    some_val