在单个Pandas Dataframe列中将字符串与数字分开,并创建两个新列

JAG*_*024 3 python extract dataframe pandas

我很震惊,以前没有人在SO上问过这个问题。因为这看起来像是一个简单的问题。

我在pandas Dataframe中只有一列,看起来像这样:

df = pd.DataFrame(data=[['APPLEGATE WINERY    455.292049'],['AMAND FARM  849.827192'],['COBB FARM ST    1039.49357'],['DIRIGIA 2048.947284']], columns = ['Col1'])

    Col1
0   APPLEGATE WINERY 455.292049
1   AMAND FARM 849.827192
2   COBB FARM ST 1039.49357
3   DIRIGIA 2048.947284
Run Code Online (Sandbox Code Playgroud)

我只想将字符串字符与数字分开,所以结果应如下所示

Name                Area
APPLEGATE WINERY    455.292049
AMAND FARM          849.827192
COBB FARM ST        1039.49357
DIRIGIA             2048.947284
Run Code Online (Sandbox Code Playgroud)

我知道我可以在python中使用正则表达式,但是这似乎有点矫kill过,因为a)只是数据类型的分离,b)字符串的长度不同,数字的位数不同。

因此,一个结果将开始如下所示:

df['Name'] = df.Col1.str.extract('([A-Z]\w{0,})', expand=True)
df['Area'] = df.Col1.str.extract('(\d)', expand=True)
Run Code Online (Sandbox Code Playgroud)

但是,有没有一种不错的,干净的解决方案可以解决此问题,而又不必经历使用RegEx并将代码中的字符串与数字分成两列的麻烦?

cs9*_*s95 6

使用一个extract电话。如果使用此正则表达式,您还希望从结果中去除尾随空格。

df2 = (df['Col1'].str.extract(r'(?P<Name>.*?)(?P<Area>\d+(?:\.\d+)?)')
                 .applymap(str.strip))
df2
               Name         Area
0  APPLEGATE WINERY   455.292049
1        AMAND FARM   849.827192
2      COBB FARM ST   1039.49357
3           DIRIGIA  2048.947284
Run Code Online (Sandbox Code Playgroud)

正则表达式分解

(?P<Name>   # first named capture group - "Name"
    .*?     # match anything (non-greedy)
)
(?P<Area>   # second named group - "Area"
    \d+     # match one or more digits,
    (?:     
       \.   # decimal
       \d+  # trailing digits
    )?      # the `?` indicates floating point is optional
)
Run Code Online (Sandbox Code Playgroud)

PS,将“面积”列转换为数字,请使用pd.to_numeric

  • 我真的很感谢正则表达式的解释!非常感谢。为了使这个解决方案发挥作用,我还必须将 Dataframe 转换为字符串“.astype(str)”,因为我之前收到错误“只能使用带有字符串值的 .str 访问器,它在 pandas 中使用 np.object_ dtype”,但现在有用。 (2认同)