python - 比较 DF 中两列的(子)字符串

标签 python string pandas dataframe

我有一个如下图所示的DF:

DF =
id  token      argument1             argument2 
1   Tza        Tuvia Tza             Moscow  
2   perugia    umbria                perugia    
3   associated the associated press  Nelson

我现在想比较列 argumentXtoken 的值,并相应地为新列 ARG 选择值。

DF =
id  token      argument1             argument2    ARG
1   Tza        Tuvia Tza             Moscow       ARG1
2   perugia    umbria                perugia      ARG2
3   associated the associated press  Nelson       ARG1

这是我尝试过的:

conditions = [
(DF["token"] == (DF["Argument1"])),
 DF["token"] == (DF["Argument2"])]

choices = ["ARG1", "ARG2"]

DF["ARG"] = np.select(conditions, choices, default=nan)

这只会比较整个字符串,如果它们相同则匹配。 .isin.contains 等构造或使用 DF["ARG_cat"] = DF.apply(lambda row: row['token '] 行 ['argument2'],axis=1) 无效。有什么想法吗?

最佳答案

使用str.contains使用正则表达式 - join token 中的所有值 | for regex OR 用于检查带单词边界的子字符串:

pat = '|'.join(r"\b{}\b".format(re.escape(x)) for x in DF["token"])
conditions = [ DF["argument1"].str.contains(pat), DF["argument2"].str.contains(pat)]

choices = ["ARG1", "ARG2"]

DF["ARG"] = np.select(conditions, choices, default=np.nan)
print (DF)
   id       token            argument1 argument2   ARG
0   1         Tza            Tuvia Tza    Moscow  ARG1
1   2     perugia               umbria   perugia  ARG2
2   3  associated  the associated ress    Nelson  ARG1

编辑:

如果要比较每一行:

d = {'id': [1, 2, 3], 
     'token': ["Tza","perugia","israel"], 
     "argument1": ["Tuvia Tza","umbria","Tuvia Tza"], 
     "argument2": ["israel","perugia","israel"]} 
DF = pd.DataFrame(data=d) 
print (DF)
   id    token  argument1 argument2
0   1      Tza  Tuvia Tza    israel
1   2  perugia     umbria   perugia
2   3   israel  Tuvia Tza    israel

conditions = [[x[0] in x[1] for x in zip(DF['token'], DF['argument1'])], 
              [x[0] in x[1] for x in zip(DF['token'], DF['argument2'])]]

choices = ["ARG1", "ARG2"]

DF["ARG"] = np.select(conditions, choices, default=np.nan)
print (DF)
   id    token  argument1 argument2   ARG
0   1      Tza  Tuvia Tza    israel  ARG1
1   2  perugia     umbria   perugia  ARG2
2   3   israel  Tuvia Tza    israel  ARG2

关于python - 比较 DF 中两列的(子)字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51836554/

相关文章:

python - 如何根据列值创建 pandas 虚拟对象

python - 根据空格和标点符号进行标记,保留标点符号

python - 将类对象追加到列表中

python - 如何使用 Sphinx autodoc 记录单个私有(private)属性?

python - 更改 Pandas 中多个日期时间列的时区信息

python - 如何提取字符串始终位于特定字符串之后,并且可以选择后跟一个字符串

Java正则表达式分割xml xpath

c - 实现 strcpy : what if the destination is shorter than the source?

python - 根据列表排序数据框,匹配 Pandas 中的一列

python - 如何获取特定时间范围的平均值