根据另一个列值替换Pandas中的列中的文本

时间:2017-10-17 01:49:51

标签: python pandas dataframe

我尝试在pandas的列中取值,然后从另一列中删除该值。但是 - replace行为并没有像我预期的那样发挥作用。

在这个例子中,我试图让col2中的值等于'

;

import pandas as pd  

#Build the dataframe
col1 = ['ABC', 'DEF']
col2 = ['something - ABC', 'something - DEF']
df1 = pd.DataFrame(['ABC', 'DEF'], columns = ['col1'])
df2 = pd.DataFrame(['something - ABC', 'something - DEF'], columns = ['col2'])
df = df1.join(df2, on=None, how='left')

#Replace ' - ABC' so column is just 'something'
df['newcolumn'] = df.col2.replace(' - '+df.col1, '')

这将返回已经在col2中的值。我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以使用str.rsplit

df['newcolumn'] = df.col2.str.rsplit('-', 1).str[0]
print(df)
  col1             col2  newcolumn
0  ABC  something - ABC  something
1  DEF  something - DEF  something

这里有一个重要的假设是你要移除的模式会成功连接字符串中的最后一个连字符。

使用str.replace使用正则表达式的另一种可能性。

df['newcolumn'] = df.col2.str.replace('-[^-]*$', '')
print(df)
  col1             col2  newcolumn
0  ABC  something - ABC  something
1  DEF  something - DEF  something

使用str.replace的另一种可能性是从col1检索所有唯一值并创建一个大规模的正则表达式(比上述方法更集中,但也慢得多)。

df['newcolumn'] = df.col2.str.replace(r'\s*\-\s*({})'.format('|'.join(vals)), '')
print(df)
  col1             col2  newcolumn
0  ABC  something - ABC  something
1  DEF  something - DEF  something

如果col1的字符串被空格分隔,那么您需要将每个字符串包裹在自己的parens中,所以请使用:

df.col2.str.replace(r'\s*\-\s*(({}))'.format(')|('.join(vals)), '')

答案 1 :(得分:1)

使用str.split

df['newcolumn']=df.col2.str.split(' -',expand=True)[0]
df
Out[136]: 
  col1             col2   newcolumn
0  ABC  something - ABC   something 
1  DEF  something - DEF   something