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

Python 如何从数据框中删除特定行?,python,pandas,dataframe,rows,Python,Pandas,Dataframe,Rows,我正在处理熊猫数据帧,如下所示 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

我正在处理熊猫数据帧,如下所示

    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

请向我推荐一种获得此结果的方法。

如果您的数据帧名称为df,则需要执行以下操作:

df = df[df['col'<>=condition]] 
5号也一样。为了提高效率,您可以将两个过滤器与“和”组合


这称为数据帧索引过滤器

您可以使用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

最简单的答案是删除零行,因为如果您有三行以上的行,它们可能会妨碍计算。然后做分组练习。然后过滤。然后像在其他问题/答案中那样加回零

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

关于你的另一个问题,我有点困惑:你想同时删除所有3=>行,还是只想给它们分配0?谢谢。我已经试过了,但问题是数据框非常大,有数千行,我无法手动搜索特定的ProjID,我必须在ProjID更改时为一行指定0值。我想,一旦我删除了不需要的行,我就应该做这部分。我提出的方法正是你想要的。“!=3”是一个条件,不是索引。这意味着当应用时,它将在数据帧中循环并删除(实际上重新分配)任何“ProjID”等于3的行。例如,df=df[df['ProjID'>3]]将过滤掉所有等于或小于3的“ProjID”行。关于您的另一个问题,最好同时重新分配零。好的,更具体地说,您希望选择满足您条件的所有行(在本例中为df[df['ProjID'3 else 0)],这里有一个相关的讨论:在您的需求中指定“有3行且少于3行”…这意味着什么?非常感谢!!您是一个救生员。
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