pandas 如何根据两个条件删除每组中不需要的行?

wtlkbnrh  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(32)

我的输入是一个框架:

df = pd.DataFrame({'col1': ['A', 'A', 'B', 'C', 'D', 'D', 'D', 'E', 'E'],
 'col2': ['x1', 'x2', 'x1', 'x1', 'x1', 'x2', 'x3', 'x1', 'x2'],
 'col3': ['', 'mssg1', 'mssg2', '', 'mssg3', '', 'mssg4', '', '']})

  col1 col2   col3
0    A   x1       
1    A   x2  mssg1
2    B   x1  mssg2
3    C   x1       
4    D   x1  mssg3
5    D   x2       
6    D   x3  mssg4
7    E   x1       
8    E   x2

字符串
我需要遍历col1列中的每个组,看看它是否是重复的,如果是True,检查col3列,只保留非空值。如果所有值都是空的,那么保留它们。
乍一看,它可以工作,但它不仅在我的真实的数据集上很慢,而且我也忽略了它是否在逻辑上遗漏了什么。

def clean(x):
    if len(x) > 1 and x['col3'].notna().any():
        return x.loc[x['col3'].notna()]
    else:
        return x

final = df.replace('', None).groupby('col1', as_index=False).apply(clean).droplevel(0).fillna('')


我的预期输出是这样的:

col1 col2   col3
1    A   x2  mssg1
2    B   x1  mssg2
3    C   x1       
4    D   x1  mssg3
6    D   x3  mssg4
7    E   x1       
8    E   x2


你们能告诉我怎么解决我的问题吗?

vtwuwzda

vtwuwzda1#

使用布尔索引:

# is col3 not empty?
m1 = df['col3'].ne('')
# is m1 not all True per col1?
m2 = ~m1.groupby(df['col1']).transform('any')

out = df[m1|m2]

字符串
输出量:

col1 col2   col3
1    A   x2  mssg1
2    B   x1  mssg2
3    C   x1       
4    D   x1  mssg3
6    D   x3  mssg4
7    E   x1       
8    E   x2

lfapxunr

lfapxunr2#

验证码

如果df的col3不是“”,或者当df按col1分组时,组中col3的所有值都是“”,则保留它

cond1 = df['col3'].eq('')
cond2 = cond1.groupby(df['col1']).transform(all)
out = df[~cond1 | cond2]

字符串
输出:

col1    col2    col3
1   A       x2      mssg1
2   B       x1      mssg2
3   C       x1  
4   D       x1      mssg3
6   D       x3      mssg4
7   E       x1  
8   E       x2

相关问题