如何根据python中的条件保留某些行

2024-06-01 21:17:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下几点意见。下面是与我的问题相关的两个领域

name   tardy
max      0
max      1
ben      0
amy      0
amy      1
sue      1
tyler    0
tyler    1

我只想保留那些既有{}又有{}的人的{。因此,我期望的输出如下

name   tardy
max      0
max      1
amy      0
amy      1
tyler    0
tyler    1

摆脱name==suename==ben使它成为唯一出现的name是那些同时具有01迟到值的人

我试着做了一个.loc

df[(df.tardy==0) & (df.tardy==1)]

但这并没有考虑按名称对其进行过滤

感谢您的帮助。谢谢


Tags: name名称dflocmax领域意见ben
3条回答

最简单的方法是使用df.groupby().filter,它根据条件过滤数据帧的组

tardy_vals = {0, 1}
df.groupby('name').filter(lambda g: tardy_vals.issubset(g['tardy']))

    name  tardy
0    max      0
1    max      1
3    amy      0
4    amy      1
6  tyler      0
7  tyler      1

您可以使用groupby().nunique()

df[df.groupby('name')['tardy'].transform('nunique')==2]

输出:

    name  tardy
0    max      0
1    max      1
3    amy      0
4    amy      1
6  tyler      0
7  tyler      1

对于大多数用于任何数据的通用解决方案,请将转换为set的组的值与原始值进行比较,并避免匹配数据,如0,1,0,如果匹配,请按长度进行比较:

vals = set([0,1])
m = df.groupby('name')['tardy'].transform(lambda x: set(x)==vals and len(x)==len(vals))
df = df[m]
print (df)
    name  tardy
0    max      0
1    max      1
3    amy      0
4    amy      1
6  tyler      0
7  tyler      1

或使用pandas函数的解决方案-如果unique与set相同,则比较值,如果匹配值0,1,则比较长度:

vals = [0,1]
g = df.groupby('name')['tardy']
df = df[g.transform('size').eq(2) & g.transform('size').eq(2) & df['tardy'].isin(vals)]
print (df)
    name  tardy
0    max      0
1    max      1
3    amy      0
4    amy      1
6  tyler      0
7  tyler      1

相关问题 更多 >