只需要从列表中选择至少存在一个值的行
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')
好的,所以 nan
s 有任何不匹配的值,所以您实际上需要:
df[df[df.loc[:,'P_1':'P_90'].isin(list())].dropna(how='all').index]
这绝对不是最有效的。
您当前的公式不起作用的原因是您基本上返回的是带有 isin
的 True/False 数组,而不是列表。 isin
不会删除行,它会根据值是否在给定列表中将单元格标记为 True
或 False
。因此,您的 True
/False
数组与原始 df 具有相同的索引,而当您执行 df[array]
时,它会采用该数组的索引,也就是相同的索引。
您希望每行都提供True
或False
,而不是每个单元格 - 此时,pandas 将按照您想要的方式进行过滤。
【讨论】:
#Jim Eisenberg,感谢您的解决方案,但我怀疑为什么 isin() 函数会返回那些找不到匹配项的行。根据我的理解,它应该只返回存在某些匹配的行。 我打赌你的代码不会运行。可能在isin()
之后添加.all(1)
。以上是关于只需要从列表中选择至少存在一个值的行的主要内容,如果未能解决你的问题,请参考以下文章
如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行