只需要从列表中选择至少存在一个值的行

Posted

技术标签:

【中文标题】只需要从列表中选择至少存在一个值的行【英文标题】:Need to select only those rows where at least one value is present from the list 【发布时间】:2020-06-09 07:13:53 【问题描述】:

我尝试使用如下isin 函数,但它返回的那些行也没有列表中的任何值:-

df[(df.loc[:,'P_1':'P_90'].isin(list))]

注意:-P_1 to P_90 表示列的范围。 样本数据:- dib-cust_id|p_1|p_2|.......|p_90 345|1950|1860|........|675

注意:- 我不能提供确切的数据,因为它是机密的。以上只是 91 列数据框的示例。

请告诉我这种方法有什么问题,还有没有其他方法可以得到想要的结果。

【问题讨论】:

你能举个例子数据吗? 能否提供数据框样本? 【参考方案1】:

你需要的是:

df[df.loc[:,'P_1':'P_90'].isin(list())].dropna(how='all')

好的,所以 nans 有任何不匹配的值,所以您实际上需要:

df[df[df.loc[:,'P_1':'P_90'].isin(list())].dropna(how='all').index]

这绝对不是最有效的。

您当前的公式不起作用的原因是您基本上返回的是带有 isin 的 True/False 数组,而不是列表。 isin 不会删除行,它会根据值是否在给定列表中将单元格标记为 TrueFalse。因此,您的 True/False 数组与原始 df 具有相同的索引,而当您执行 df[array] 时,它会采用该数组的索引,也就是相同的索引。

您希望每行都提供TrueFalse,而不是每个单元格 - 此时,pandas 将按照您想要的方式进行过滤。

【讨论】:

#Jim Eisenberg,感谢您的解决方案,但我怀疑为什么 isin() 函数会返回那些找不到匹配项的行。根据我的理解,它应该只返回存在某些匹配的行。 我打赌你的代码不会运行。可能在isin() 之后添加.all(1)

以上是关于只需要从列表中选择至少存在一个值的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL删除存在值的行和具有该值的后续列

用于从表中选择具有最新时间戳的行的 JOOQ 代码

连接表并选择给定 id 仅存在一个值的行

如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行

POSTGRES:如何仅在另一个值不存在时选择具有某个值的行,在这种情况下选择另一个值?

如何从计数中选择具有最大产生值的行