我有一个数据框,其中包含一个字符串列,该字符串列包含几个不同的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
的等效性。
答案 0 :(得分:0)
您的字典中定义的正则表达式可能与数据框的多行匹配,而python对于从字典中获取哪个替换值感到困惑。
并且,当检查numpy数组的布尔值时,将强制执行此错误,以免用户猜测。 如果
,您是否认为元素数组为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]]