繁体   English   中英

从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

[英]Search for a partial string match in a data frame column from a list - Pandas - Python

我有一个清单:

things = ['A1','B2','C3']

我有一个pandas数据框,其中一列包含以分号分隔的值 - 一些行将包含与上面列表中的一个项匹配的匹配(由于它具有字符串的其他部分,因此不会完美匹配)列...例如,该列中的一行可能有'哇;这里;这= A1 ; 10001; 0')

我想保存包含与列表中的项匹配的行,然后使用这些选定的行创建一个新的数据框(应该具有相同的标题)。 这是我试过的:

import re

for_new_df =[]

for x in df['COLUMN']:
    for mp in things:
        if df[df['COLUMN'].str.contains(mp)]:
            for_new_df.append(mp)  #This won't save the whole row - help here too, please.

这段代码给了我一个错误:

ValueError:DataFrame的真值是不明确的。 使用a.empty,a.bool(),a.item(),a.any()或a.all()。

我对编码很新,所以答案中的解释和细节越多越好! 提前致谢。

您可以通过加入单词列表来创建正则表达式并使用str.contains来避免循环:

pat = '|'.join(thing)
for_new_df = df[df['COLUMN'].str.contains(pat)]

应该工作

因此正则表达式模式变为: 'A1|B2|C3' ,这将匹配包含任何这些字符串的字符串中的任何位置

例:

In [65]:
things = ['A1','B2','C3']
pat = '|'.join(things)
df = pd.DataFrame({'a':['Wow;Here;This=A1;10001;0', 'B2', 'asdasda', 'asdas']})
df[df['a'].str.contains(pat)]

Out[65]:
                          a
0  Wow;Here;This=A1;10001;0
1                        B2

至于它失败的原因:

if df[df['COLUMN'].str.contains(mp)]

这一行:

df[df['COLUMN'].str.contains(mp)]

返回一个由内部str.contains的boolean数组掩盖的df, if不了解如何评估一个布尔数组,从而导致错误。 如果你想一想,如果你是真的或者只有一个是真的,它该怎么办? 它期望一个标量,而不是像数组一样的值。

熊猫实际上是惊人的,但我觉得它很容易使用。 然而,它确实具有许多旨在简化生活的功能,包括用于搜索大量数据帧的工具。

虽然它可能不是您问题的完整解决方案,但这可能会帮助您摆脱困境。 我假设您知道要搜索的列,在我的示例中为A列。

import pandas as pd

df = pd.DataFrame({'A' : pd.Categorical(['Wow;Here;This=A1;10001;0', 'Another;C3;Row=Great;100', 'This;D6;Row=bad100']),
                   'B' : 'foo'})
print df #Original data frame
print
print df['A'].str.contains('A1|B2|C3')  # Boolean array showing matches for col A
print
print df[df['A'].str.contains('A1|B2|C3')]   # Matching rows

输出:

                          A    B
0  Wow;Here;This=A1;10001;0  foo
1  Another;C3;Row=Great;100  foo
2        This;D6;Row=bad100  foo

0     True
1     True
2    False
Name: A, dtype: bool

                          A    B
0  Wow;Here;This=A1;10001;0  foo
1  Another;C3;Row=Great;100  foo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM