如何通过两个字符串列之间的差异在pandas中创建新列?

时间:2018-11-13 20:19:58

标签: python regex pandas

我如何在pandas中创建一个新列,这是其他两个由字符串组成的列之差的结果?

我有一列名为“ Good_Address”的列,其条目为“ 123 Fake Street Apt 101”,另一列名为“ Bad_Address”,其条目为“ 123 Fake Street”。我希望列“ Address_Difference”中的输出为“ Apt101”。

我尝试做:

import pandas as pd
data = pd.read_csv("AddressFile.csv")
data['Address Difference'] = data['GOOD_ADR1'].replace(data['BAD_ADR1'],'') 
data['Address Difference']

但这不起作用。看来结果只等于“ 123 Fake Street Apt101”(在上面的示例中为好地址)。

我也尝试过:

data['Address Difference'] = data['GOOD_ADR1'].str.replace(data['BAD_ADR1'],'')

但是这会产生一个错误,指出“系列”对象是可变的,因此不能进行散列。

任何帮助将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:3)

replaceregex一起使用

data['Address Difference']=data['GOOD_ADR1'].replace(regex=r'(?i)'+ data['BAD_ADR1'],value="")

答案 1 :(得分:2)

我将使用一个可以跨输入映射的函数。这应该很快。

该函数将使用str.find来查看其他字符串是否是子集。如果str.find的结果为-1,则找不到子字符串。否则,根据找到的位置和子字符串的长度,解压缩子字符串。

def rm(x, y):
  i = x.find(y)
  if i > -1:
    j = len(y)
    return x[:i] + x[i+j:]
  else:
    return x

df['Address Difference'] = [*map(rm, df.GOOD_ADR1, df.BAD_ADR1)]

df

          BAD_ADR1                GOOD_ADR1 Address Difference
0  123 Fake Street  123 Fake Street Apt 101            Apt 101

答案 2 :(得分:1)

您可以从好地址替换坏地址部分

df['Address_Difference'] = df['Good_Address'].replace(df['Bad_Address'], '', regex = True).str.strip()


    Bad_Address     Good_Address            Address_Difference
0   123 Fake Street 123 Fake Street Apt 101 Apt 101