根据条件(pandas,python3)删除DF中的所有数据

时间:2015-10-13 05:49:27

标签: python-3.x pandas

我有一个像这样的熊猫DF:

    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

1 个答案:

答案 0 :(得分: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]