Pandas数据框中的部分字符串匹配

时间:2019-11-20 15:26:22

标签: python pandas

我有一个数据框,其中包含一个字符串列,该字符串列包含几个不同的4个字符,可以用|&分隔,但并非总是如此。我正在尝试将字典映射到每个离散的4个字符的项目,但是遇到了问题。熊猫23.4版

我要使用的基本代码:

df = df.replace(dict, regex=True)

,或者尝试选择特定的颜色:

df['Col'] = df['Col'].replace(dict, regex=True)

两者都会引发以下错误:

ValueError: The truth value of an array with more that one element is ambiguous. Use a.any() or a.all()

字典的值是list类型。这是执行.replace的问题吗?

使用示例df和dict更新

 ID       Code
ABCD      00FQ
JKFA    8LK9|4F5H
QWST    2RLA|R1T5&8LK9


dict={'00FQ':['A','B'], '8LK9':['X'], '4F5H':['U','Z'], '2RLA':['H','K'], 'R1T5':['B','G'] }

该字典中将包含比数据框中更多的元素。

使用预期的输出进行更新

 ID       Code           Logic
ABCD      00FQ          ['A','B']
JKFA    8LK9|4F5H       ['X'] | ['U','Z']
QWST    2RLA|R1T5&8LK9  ['H','K'] | ['B','G'] & ['X']

总体目标是对两个数据框执行此替换,然后比较两边的ID's的等效性。

2 个答案:

答案 0 :(得分:0)

您的字典中定义的正则表达式可能与数据框的多行匹配,而python对于从字典中获取哪个替换值感到困惑。

并且,当检查numpy数组的布尔值时,将强制执行此错误,以免用户猜测。 如果

,您是否认为元素数组为True?
  • 其任何元素为True或
  • 所有元素都是真实的 或
  • 还有其他事情。

因此,它抛出此错误以允许程序员明确提及它。

转到Here进行详细说明。

答案 1 :(得分:0)

这是一个允许您从字符串中解析相关值的函数:

def string_to_list(string):
    """
    parses a parent string for 4 character children strings
    returns a list of children strings
    """
    # instantiate values
    child = ''
    children = []

    if len(string)<4:
        return None

    for n in string:
        # skip if not wanted
        if n in ['|','&']:
            continue

        child+=n
        if len(child)==4:
            children.append(child)
            child = ''

    # finished
    return children

应用它以提取值列表,如下所示:

df['Code_List'] = df['Code'].apply(string_to_list)

映射到相关的logic值:

# Instantiate the dictionary of logic rules
logic_dict = {'00FQ':['A','B'], '8LK9':['X'], '4F5H':['U','Z'], '2RLA':['H','K'], 'R1T5':['B','G'] }

# Map the logic rules
df['Logic_List'] = df['Code_List'].apply(lambda arr: [logic_dict[x] for x in arr])

# Final output
    ID      Code            Code_List           Logic_List
0   ABCD    00FQ            [00FQ]              [[A, B]]
1   JKFA    8LK9|4F5H       [8LK9, 4F5H]        [[X], [U, Z]]
2   QWST    2RLA|R1T5&8LK9  [2RLA, R1T5, 8LK9]  [[H, K], [B, G], [X]]