【问题标题】:Search for a partial string match in a data frame column from a list - Pandas - Python从列表中搜索数据框列中的部分字符串匹配 - Pandas - Python
【发布时间】:2016-07-13 00:36:38
【问题描述】:

我有一个清单:

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

我有一个 pandas 数据框,其中有一列包含用分号分隔的值 - 一些行将包含与上面列表中的一项匹配(它不会是完美匹配,因为它有其他部分列中的字符串.. 例如,该列中的一行可能有 'Wow;Here;This=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()。

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

【问题讨论】:

  • 对于使用多个关键字的部分字符串搜索,我建议查看this answer.

标签: python pandas


【解决方案1】:

您可以通过加入单词列表来创建正则表达式并使用 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 的布尔数组屏蔽的df,if 不了解如何评估布尔数组,因此会出现错误。如果您考虑一下,如果您是 1 True 或除 1 True 之外的所有内容,该怎么办?它需要一个标量,而不是像值这样的数组。

【讨论】:

  • 对不起@EdChum - 在研究我的解决方案时,我没有意识到我基本上复制了你的解决方案
  • @emmalg 不用担心,你想做什么由你决定
  • @EdChum 如何检查列表中的哪些项目 (things = ['A1|B1|C1']) 在“A”列中根本找不到?
  • 你真的应该再发一个问题
  • @Yuva 抱歉,但在 cmets 中提问的形式很糟糕,我也不明白你在问什么。最好发布一个新问题,包括您的原始数据、重现您的 df 的代码、您想要的结果和所有尝试。
【解决方案2】:

Pandas 确实很棒,但我觉得它不是很容易使用。然而,它确实有许多旨在让生活更轻松的功能,包括用于搜索大量数据帧的工具。

虽然它可能无法完全解决您的问题,但这可能会帮助您走上正轨。我假设你知道你在哪一列中搜索,在我的例子中是 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

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2021-03-15
    • 2020-04-01
    相关资源
    最近更新 更多