2015-10-13 62 views
1

我有一个熊猫DF这样的删除所有数据:在DF按组基于条件(大熊猫,python3)

User  Enrolled Time 
    1   0   12 
    1   0   1 
    1   1   2 
    1   1   3 
    2   1   3 
    2   0   4 
    2   1   1 
    3   0   2 
    3   0   3 
    3   1   4 
    4   0   1 

我想删除的用户信息中的所有行,他们都报名参加了。每个用户的注册机会都按顺序排列。预期的输出如下所示:

User  Enrolled  Time 
    1   0    12 
    1   0    1 
    1   1    2 
    2   1    3 
    3   0    2 
    3   0    3 
    3   1    4 

希望有人能帮助我!

编辑:例如基于对正确答案的评论:

 User  Enrolled  Time 
     4   0    1 
     4   0    2 
     4   0    3 
     5   0    1 

回答

2

我认为你在寻找什么是groupby后跟apply这不正确的逻辑为每个用户。例如:

df = pd.DataFrame([[ 1, 0, 12], 
        [ 1, 0, 1], 
        [ 1, 1, 2], 
        [ 1, 1, 3], 
        [ 2, 1, 3], 
        [ 2, 0, 4], 
        [ 2, 1, 1], 
        [ 3, 0, 2], 
        [ 3, 0, 3], 
        [ 3, 1, 4]], 
        columns=['User', 'Enrolled', 'Time']) 

def filter_enrollment(df): 
    enrolled = df[df.Enrolled == 1].index.min() 
    return df[df.index <= enrolled] 

result = df.groupby('User').apply(filter_enrollment).reset_index(drop=True) 

结果是:

>>> print(result) 
    User Enrolled Time 
0  1   0 12 
1  1   0  1 
2  1   1  2 
3  2   1  3 
4  3   0  2 
5  3   0  3 
6  3   1  4 

在这里,我假设你的行是按时间顺序。如果您想按时间列过滤,只需在过滤器功能中将index更改为Time即可。

编辑:获得编辑的问题的答案,就可以过滤功能更改为类似这样:

def filter_enrollment(df): 
    enrolled = df[df.Enrolled == 1].index.min() 
    if pd.isnull(enrolled): 
     return df 
    else: 
     return df[df.index <= enrolled] 
+0

谢谢!这工作完美:)我已经接受你的答案,因为它回答了我原来的问题。对不起,我想知道是否有任何简单的方法来保留那些永远不会注册的用户(例如,用户4有0,0,0)?我用一个例子更新了我原来的问题。 – user3682157

+0

对于这种情况,您可以更改过滤功能。如果有任何登记== 1的条目,则返回当前结果。否则,返回第一行。 – jakevdp

+0

如果有多行可变(例如,有些人有3次参与并且没有参与的机会,其他参与者只有1人)? – user3682157