【问题标题】:pandas to find match in column1 and update corresponding row on a column2pandas 在 column1 中找到匹配项并更新 column2 上的相应行
【发布时间】:2020-10-24 22:43:51
【问题描述】:
import pandas as pd
import re

df = pd.read_csv("df.csv")

df

_id,column1,column2
1,FullName,
2,xyz,
3,custname,
4,FullNm,
5,FirstName,
6,abc

如果在这种情况下 column1 中的任何值仅由给定的一组关键字组成(full、name、nm、txt、dsc),并且此处关键字“full”是强制性存在的,则将“column2”更新为“全名”否则将其留空。我们如何使用正则表达式来实现或是否有其他简单的方法

我试图这样做

df.column2 = df.column1.str.replace('full|name|nm|txt|dsc',"Full Name")

我得到一个错误的输出:

_id,column1,column2
1,FullName,FullName
2,xyz,xyz
3,custname,custname
4,FullNm,FullNm
5,FirstName,FirstName
6,abc,abc

需要输出的地方:

_id,column1,column2
1,FullName,Full Name
2,xyz,
3,custname,
4,FullNm,Full Name
5,FirstName,
6,abc

我可以使用 awk 轻松实现:

awk -F , -v OFS=, 'gensub(/full|name|nm|txt|dsc[0-9]*/,"","g",tolower($2))=="" {$3="Full Name"; print $0}' df.csv| awk -F , -v OFS=, '(tolower($2) ~ /full/) {print $0}'

条件

给定一组关键字 - full|name|nm|txt|dsc[0-9] 强制关键字 - 完整的

以下是不符合条件的情况。

案例1

custfullname - 这里 cust 不在给定的单词集中,所以不要更新 column2

案例2

txtnmdsc - 这里的值由给定的一组关键字组成,但不包含强制关键字。

以下是它匹配的条件:

fulltxt1
fulldsc
fullname
full
full123

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    您可以使用numpy where 来检查条件。如果 column1 contains full,则 column2 保持不变,如果不是,则替换为空字符串:

    保持简单,并使用您提供的完全匹配:

    words = ["fulltxt1", "fulldsc", "fullname", "full", "full123"]
    check = f"{'|'.join(words)}"
    print(check)
    'fulltxt1|fulldsc|fullname|full|full123'
    
     df.column2 = np.where(df.column1.str.contains(check, case=False), "Full Name", "")
    
           _id  column1     column2
       0    1   FullName    Full Name
       1    2   xyz 
       2    3   custname    
       3    4   FullNm      Full Name
       4    5   FirstName   
       5    6   abc 
    

    【讨论】:

    • 谢谢 - 但我的匹配条件 - 如果 column1 中的任何值在这种情况下仅由给定的一组关键字组成(full、name、nm、txt、dsc),这里的关键字“full”是强制存在,然后将“column2”更新为“全名”,否则将其留空。它不应该只基于一个关键字,它还应该包含其他关键字。
    • 我更新了代码,让我知道它是否符合您的需求
    • 感谢我更新了条件,并解释了条件匹配和不匹配的位置。
    • 我们可以包含一个模式以包含任何数字,例如 - [0-9]
    • @@sammywemmy 我对这段代码有一个问题。我将为此提出另一个问题。
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2022-11-03
    • 2020-09-15
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多