我主要是R用户,但我在某些用例中切换到Python,而且我还有一个非常简单的任务,那就是清理值/数据准备。
我有一个数据框,其值为原始格式并且基于值,我想创建一个具有干净值的新列,使用像string.replace()这样的函数
让我们创建一个虚拟表:
import pandas as pd
dummy_table = pd.DataFrame(data = ["London - City", "Manchester - City"], columns = ["City_raw"])
dummy_table
City_raw
0 London - City
1 Manchester - City
在R中,我将使用一个非常简单和直接的逻辑来创建一个具有修改原始值的新列。
dummy_table$City_clean <- gsub(" - City", "", dummy_table$City_raw)
结果将是:
City_raw City_clean
0 London - City London
1 Manchester - City Manchester
我想保留两个列,原始和新修改。 我尝试过在Python中使用这种语法:
dummy_table['City_clean'] = dummy_table['City_raw'].replace(" - City", "", inplace = False)
但是结果表的新列具有与原始列相同的值,这意味着没有替换完成,只复制值。
City_raw City_clean
0 London - City London - City
1 Manchester - City Manchester - City
我的问题是:是否有一些简单直接的语法可以对列进行矢量化(对列的所有值进行操作)操作并创建一个新列,或者我是否需要在Python中使用并使用某种应用/ lambda函数?
我也很感激为什么它在R中工作而不在Python中工作,或者我在做错误的工作。
答案 0 :(得分:5)
replace
中需要regex=True
:
dummy_table['City_clean'] = dummy_table['City_raw'].replace(" - City", "", regex = True)
print (dummy_table)
City_raw City_clean
0 London - City London
1 Manchester - City Manchester
或更好:
dummy_table['City_clean'] = dummy_table['City_raw'].replace("\s*-\s*City", "", regex = True)
print (dummy_table)
City_raw City_clean
0 London - City London
1 Manchester - City Manchester
答案 1 :(得分:5)
我们可以使用Series.str.split()方法,然后使用.str[0] accessor访问每行的列表的第一个元素:
In [43]: dummy_table['City_clean'] = dummy_table.City_raw.str.split('\s*-\s*').str[0]
In [44]: dummy_table
Out[44]:
City_raw City_clean
0 London - City London
1 Manchester - City Manchester
一步一步:
In [50]: dummy_table.City_raw.str.split('\s*-\s*')
Out[50]:
0 [London, City]
1 [Manchester, City]
Name: City_raw, dtype: object
In [51]: dummy_table.City_raw.str.split('\s*-\s*').str[0]
Out[51]:
0 London
1 Manchester
Name: City_raw, dtype: object