在 Pandas 数据框中使用正则表达式创建新列

8

我有一个pandas数据帧中的列,类型为object,我想解析该列以获取字符串中的第一个数字,并创建一个包含该数字作为int的新列。

例如:

现有数据帧

    col
    'foo 12 bar 8'
    'bar 3 foo'
    'bar 32bar 98'

期望的数据框

    col               col1
    'foo 12 bar 8'    12
    'bar 3 foo'       3
    'bar 32bar 98'    32

我有一段代码可以在列系列中的任何单元格上运行:
int(re.search(r'\d+', df.iloc[0]['col']).group())
以上代码可以正常工作并返回应该返回的12。但是,当我尝试使用整个系列创建一个新的列时:
df['col1'] = int(re.search(r'\d+', df['col']).group())
我会得到以下错误:
TypeError: expected string or bytes-like object
我尝试在df ['col']周围包装str(),这消除了错误,但在col1中产生了所有的0。
我还尝试将col转换为字符串列表,并通过列表进行迭代,但只会产生相同的错误。有人知道我做错了什么吗?非常感谢您的帮助。

请查看 DataFrame.apply() 方法。可能你的计算过于复杂无法使用简单赋值。 - Dave Kielpinski
5
你可以尝试使用 df['col'].str.extract(r'(\d+)') - Wiktor Stribiżew
@WiktorStribiżew,我还会添加 expand=False... - MaxU - stand with Ukraine
@WiktorStribiżew 非常感谢,这个完美解决了! - Cam8593
1个回答

15

这样就可以了:

new_column = []    
for values in df['col']:
    new_column.append(re.search(r'\d+', values).group())

df['col1'] = new_column

输出结果如下:

            col    col1
0  foo 12 bar 8      12
1     bar 3 foo       3
2  bar 32bar 98      32

3
该列表的名称与正则表达式方法(search)相同,这让我感到有点困惑。mylist = []mylist.append... 可能会使其更清晰易懂。 - RolfBly
https://stackoverflow.com/questions/58973981/python-create-new-column-with-regex 这种方法更好。在数据框中使用for循环是一个明显的警告信号。 - Sergo055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接