我有一个DataFrame,它在每个列中包含一堆条目.然而,这些条目只是数字列表的字符串(不是正确的列表,正如python定义的那样),如下所示:

data = {'name1': ['1456, 1324, 4782', '5428'], 
        'name2': ['7832, 1477, 8092', ''], 
        'name3': ['9496', '7842, 8326'], 
        'name4': ['5532, 1886', '7732, 6512, 9044']}

理想情况下,代码的最终结果将是确定哪些列包含某个数字,因此如果我要查找1477,它将为Column name2返回True,或者返回包含该数字的列标签列表(因此仅为name2),这两种输出都是可行的.

由于数据是这样组织的,我不能寻找完全相等的数据,所以我不能使用.isin==.另一个问题是我不知道它在数据框中的什么位置,所以我也不能指定某个列或索引来转换为序列并查看.我try 过使用.loc.contains.filter的方法,但失败了,因为当您可以搜索要使用的特定列或索引时,它们似乎工作得最好.我得到的最接近的建议是使用this post人的建议.这样做的问题在于,它查找的是与带有‘==’的字符串完全匹配的内容,并且查找的是索引,而不是列.最后要注意的是,我的实际DataFrame包含的条目比本例多得多,所以如果可能的话,我不希望使用for个循环来迭代每一行和每一列,但从技术上讲,如果绝对必要的话,这将是可行的.

我承认,除了我读过的帖子和博客之外,我对Pandas 的了解非常有限,所以也许我只是忽略了一些简单的东西?希望有人能给出一个比暴力循环更有效的答案.

推荐答案

您可以为每列使用str.contains(apply),并使用any标识至少有一个匹配的列:

out = df.apply(lambda s: s.str.contains(r'\b1477\b').any())

NB. the 100 are regex word boundaries, to ensure 101 doesn't match 102 for example.

或者,使用splitexplode:

out = df.apply(lambda s: s.str.split(', ').explode().eq('1477').any())

输出:

name1    False
name2     True
name3    False
name4    False
dtype: bool

然后,如果您想要索引列表:

out.index[out]
# Index(['name2'], dtype='object')

或者对匹配列进行切片:

df.loc[:, out]

Python相关问答推荐

在Python中处理大量CSV文件中的数据

如何将双框框列中的成对变成两个新列

如何标记Spacy中不包含特定符号的单词?

将两只Pandas rame乘以指数

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

如何在solve()之后获得症状上的等式的值

无法连接到Keycloat服务器

名为__main__. py的Python模块在导入时不运行'

如何在FastAPI中为我上传的json文件提供索引ID?

基于形状而非距离的两个numpy数组相似性

当条件满足时停止ODE集成?

用两个字符串构建回文

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

Python如何导入类的实例

极点替换值大于组内另一个极点数据帧的最大值

使用pythonminidom过滤XML文件

迭代工具组合不会输出大于3的序列

如何在Polars中处理用户自定义函数的多行结果?

使用Django标签显示信息

如何从具有完整层次数据的Pandas框架生成图形?