我尝试在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中的值。我错过了什么?
答案 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