我有一个数据帧df
:
A B C D E
0 string1 string4 [string7, string10, ...] [string11, string 12] [string15, ...]
1 string2 string5 [string8, ...] [string13, ...] [string16, ...]
2 string3 string6 [string9, ...] [string14, ...] [string17, ...]
和一个列表{
to_delete = [string7, string9, string17]
我想删除数据框中包含to_delete
中字符串的所有行,但我不知道如何将.isin
与列表一起使用
我知道已经有几个答案了,但如果可以的话,我想加入我的答案。我认为SeaBean's solution也是正确的,我喜欢这一点,与other proposed solution不同,您不必指定哪些列具有列表
我不能像SeaBean那样解释我的解决方案,因为这是我不久前遇到的东西,我诚实地用试错法提出了它
我试着用更多的项目来计时,似乎我的解决方案稍微好一点
输出:
我能想到的最糟糕的解决方案是使用
apply
:df(输入):
res:
您可以通过以下步骤接近:
您可以在每个列/元素上使用
pd.Series.explode()
将字符串列表展开为多行,每行仅包含字符串(所有列表都已展开/分解为行)然后使用
.isin()
检查数据帧中to_delete
列表中的字符串按索引级别0分组(在分解之前包含原始行索引),将多行匹配结果聚合并汇总回一行(使用
groupby()
下的.sum()
)然后
.sum(axis=1)
按行检查要删除的任何匹配字符串检查0匹配的行(要保留的行)并形成结果行的布尔索引
最后,使用
.loc
过滤不匹配的行以保留结果:
可根据以下代码构建原始数据帧以进行测试:
相关问题 更多 >
编程相关推荐