使用 Pandas 解析数据 - 如何仅将匹配项输出为 CSV 中的数据列

问题描述 投票:0回答:1

希望能帮到你。我有一个例程来读取 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”的字符串,但我想用匹配条件替换找到的字符串。

有人可以解释一下我需要在这里更改什么吗?

根据上面的代码,我可以进行过滤,因此我只获得包含“角色 B”或“角色 D”的字符串,但我想用匹配条件替换找到的字符串,而不是角色列表。

根据迄今为止收到的评论进一步解释:

  • ‘fltr_field’的内容是什么?

fltr_field 包含要过滤的列的名称(在本例中,我正在过滤名为“Role”的列。

  • 你能清楚地解释一下你想在这里做什么吗?

我希望将 Role 列的内容替换为匹配的值。

  • 登录栏的本质是什么?

登录栏包含上次登录日期

python pandas dataframe substitution
1个回答
0
投票

使用此输入数据帧生成器:

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])"
# New column: matching content from "Role" column
df['Role filtered'] = df['Role'].str.extract(pat=role_pattern)
# Remove non matching rows and replace the original "Role" column with the extracted roles
df.dropna(subset = ['Role filtered']
         ).drop(columns = 'Role'
         ).rename(columns = {'Role filtered':'Role'})

     Name       Login    Role
0    Phil  2024/01/01  Role B
1     Bob  2024/02/01  Role B
3    Jane  2024/01/31  Role B
4    Mary  2024/02/12  Role D
5     Liz  2024/02/21  Role B
6  Phoebe  2023/11/21  Role D
8    Rick  2024/01/13  Role D

或者,因为您可能会创建一个新的数据框,以保持原始的 df 不变,所以这一行将产生与

df1
相同的结果:

df1 = df.assign(Role = df['Role'].str.extract(pat=role_pattern)
       ).dropna(subset = ['Role'])
© www.soinside.com 2019 - 2024. All rights reserved.