我有一个例程来读取 CSV 文件并吐出符合特定条件的选定列:
CSV 输入文件看起来像这样
姓名 | 角色 | 登录 |
---|---|---|
菲尔 | 角色A |角色B | 2024/01/01 |
鲍勃 | 角色A |角色B | 2024/02/01 |
亚瑟 | 角色A |角色C | 2024/01/04 |
简 | 角色B |角色C | 2024/01/31 |
玛丽 | 角色A |角色D | 2024/02/12 |
莉兹 | 角色B |角色 F | 2024/02/21 |
菲比 | 角色C |角色D | 2023/11/21 |
迈克 | E角色 | 2024/02/15 |
瑞克 | 角色 D |角色E | 2024/01/13 |
希拉里 | 角色F | 2024/01/11 |
我有一个根据传递的值进行匹配的代码块:
# Define function to check if a value matches any of the filter values
def matches_filter(value):
value_lower = value.lower()
for filter_value in value_lower.split("|"):
filter_value_lower = filter_value.lower()
for fvals in fltr_values:
if fvals.lower() in filter_value_lower:
return fvals.lower()
return None
# Apply filter
# filtered_df = df[df[fltr_field].apply(matches_filter)]
df[fltr_field + "_matched"] = df[fltr_field].apply(matches_filter)
基于传递值“角色 B”和“角色 D”,我想用过滤器的结果替换“角色”列中的任何内容。因此,最终结果表应如下所示:
姓名 | 角色 | 登录 |
---|---|---|
菲尔 | 角色B | 2024/01/01 |
鲍勃 | 角色B | 2024/01/01 |
简 | 角色B | 2024/02/03 |
玛丽 | D角色 | 2024/02/02 |
莉兹 | 角色B | 2024/02/12 |
菲比 | D角色 | 2024/02/21 |
瑞克 | D角色 | 2024/01/31 |
到目前为止,代码将进行过滤,因此我只获得包含“角色 B”或“角色 D”的字符串,但我想用匹配条件替换找到的字符串,而不是角色列表。有人可以解释一下我需要在这里更改什么吗?
根据迄今为止收到的评论进一步解释:
fltr_field
的内容是什么?fltr_field
包含要过滤的列的名称(在本例中,我正在过滤名为 "Role"
的列。
我希望将 Role 列的内容替换为匹配的值。
"Login"
列的性质是什么?"Login"
列包含上次登录日期。
使用此输入数据帧生成器:
df = pd.DataFrame({'Name': {0: 'Phil', 1: 'Bob', 2: 'Arthur', 3: 'Jane', 4: 'Mary', 5: 'Liz', 6: 'Phoebe', 7: 'Mike', 8: 'Rick', 9: 'Hilary'},
'Role': {0: 'Role A | Role B', 1: 'Role A | Role B', 2: 'Role A | Role C', 3: 'Role B | Role C', 4: 'Role A | Role D', 5: 'Role B | Role F', 6: 'Role C | Role D', 7: 'Role E', 8: 'Role D | Role E', 9: 'Role F'},
'Login': {0: '2024/01/01', 1: '2024/02/01', 2: '2024/01/04', 3: '2024/01/31', 4: '2024/02/12', 5: '2024/02/21', 6: '2023/11/21', 7: '2024/02/15', 8: '2024/01/13', 9: '2024/01/11'}})
Name Role Login
0 Phil Role A | Role B 2024/01/01
1 Bob Role A | Role B 2024/02/01
2 Arthur Role A | Role C 2024/01/04
3 Jane Role B | Role C 2024/01/31
4 Mary Role A | Role D 2024/02/12
5 Liz Role B | Role F 2024/02/21
6 Phoebe Role C | Role D 2023/11/21
7 Mike Role E 2024/02/15
8 Rick Role D | Role E 2024/01/13
9 Hilary Role F 2024/01/11
正则表达式模式提取看起来是您的最佳选择:
# Define search - insert any number of Role letters inside the brackets
role_pattern = "(Role\s[BD])"
# Generate filtered table
df.assign(Role = df['Role'].str.extract(pat=role_pattern)
).dropna(subset = ['Role'])
Name Role Login
0 Phil Role B 2024/01/01
1 Bob Role B 2024/02/01
3 Jane Role B 2024/01/31
4 Mary Role D 2024/02/12
5 Liz Role B 2024/02/21
6 Phoebe Role D 2023/11/21
8 Rick Role D 2024/01/13
我认为不需要复杂的动态列名称(我的意思是你的
df[fltr_field + "_matched"]
),因为你想要的输出中的最后一列无论如何都被称为"Role"
。
更新以将各种角色匹配为整个单词
替代输入:
在存在其他角色(例如“角色 A”、“角色 AB”、“Aphal”、“Alpha A”)的情况下过滤角色“Alpha”和“角色 B”
df = pd.DataFrame({'Name': {0: 'Phil', 1: 'Bob', 2: 'Arthur', 3: 'Jane', 4: 'Mary', 5: 'Liz', 6: 'Phoebe', 7: 'Mike', 8: 'Rick', 9: 'Hilary'},
'Role': {0: 'Role A | Role B', 1: 'Role A | Role B', 2: 'Role A | Role C', 3: 'Role B | Role C', 4: 'Role A | Role D', 5: 'Role BA | Role F', 6: 'Role C | Role D', 7: 'Aphal', 8: 'Alpha B | Role E', 9: 'Alpha'},
'Login': {0: '2024/01/01', 1: '2024/02/01', 2: '2024/01/04', 3: '2024/01/31', 4: '2024/02/12', 5: '2024/02/21', 6: '2023/11/21', 7: '2024/02/15', 8: '2024/01/13', 9: '2024/01/11'}}
Name Role Login
0 Phil Role A | Role B 2024/01/01
1 Bob Role A | Role B 2024/02/01
2 Arthur Role A | Role C 2024/01/04
3 Jane Role B | Role C 2024/01/31
4 Mary Role A | Role D 2024/02/12
5 Liz Role BA | Role F 2024/02/21
6 Phoebe Role C | Role D 2023/11/21
7 Mike Aphal 2024/02/15
8 Rick Alpha B | Role E 2024/01/13
9 Hilary Alpha 2024/01/11
# simple variant for whole words that will mistake "Role BA" for a "Role B":
role_pattern = "(Alpha|Role B)"
# Safe variant for whole words that prevents this: (with lookahead assertion)
role_pattern = '(Alpha(?=($|\s|))|Role B(?=($|\s|)))'
df.assign(Role = df['Role'].str.extract(pat=role_pattern)
).dropna(subset = ['Role'])
Name Role Login
0 Phil Role B 2024/01/01
1 Bob Role B 2024/02/01
3 Jane Role B 2024/01/31
9 Hilary Alpha 2024/01/11
只要角色之间用“|”输入,带有前瞻断言的“安全变体”就会起作用。它确保角色名称后面跟着
参考文献