Python pandas Dataframe:删除所有行,直到第一次出现某个特定值

时间:2019-01-09 10:23:11

标签: python pandas dataframe group-by pandas-groupby

我有一个看起来像熊猫的“数据框”,也请告诉我您是否需要pd.Dataframe到下表中。

iD      a   b   c
c1      2   3   4
c1      2   3   4
c1      2   3   4
c1      2   E   4
c1      2   3   4
c2      3   4   5
c2      3   4   5
c2      3   E   5
c2      3   4   5

现在在此数据帧中有两个ID c1和c2。每当“ E”出现在“ b”列中时,我都希望删除上面的所有行。

我的最终数据框应该看起来像

iD      a   b   c
c1      2   E   4
c1      2   3   4
c2      3   E   5
c2      3   4   5

只是想让问题简短一些,以便人们回答。请让我知道是否需要在数据框中添加一些额外的数据点

2 个答案:

答案 0 :(得分:4)

在布尔值掩码上使用groupbycumsum,以比较列“ b”与字母“ E”:

df[df.b.eq('E').groupby(df.iD).cumsum()]

   iD  a  b  c
3  c1  2  E  4
4  c1  2  3  4
7  c2  3  E  5
8  c2  3  4  5

df[df.b.eq('E').groupby(df.iD).cumsum()].reset_index(drop=True)

   iD  a  b  c
0  c1  2  E  4
1  c1  2  3  4
2  c2  3  E  5
3  c2  3  4  5

答案 1 :(得分:1)

您可以groupby result = [] for sublst in lists: if check_valid(sublst): result.append(sublst) print(result) # [[['L', 5], ['B', 20], ['A', 10]], [['L', 5], ['L', 6]], [['A', 10], ['L', 12], ['A', 11], ['A', 15]]] 并将idxmaxresult = [sublst for sublst in lists if check_valid(sublst)] print(result) # [[['L', 5], ['B', 20], ['A', 10]], [['L', 5], ['L', 6]], [['A', 10], ['L', 12], ['A', 11], ['A', 15]]] 一起使用,以防止从第一个iD开始被发现:

boolean indexing