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