我有一个像这样的熊猫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
答案 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]