【问题标题】:Pandas - Extract a phrase from one column and adding it to a new columnPandas - 从一列中提取短语并将其添加到新列
【发布时间】:2020-07-05 14:42:03
【问题描述】:

我在(第 1 列)中有一些文本数据,我想知道是否可以从该列中的行中提取特定序列并将它们添加到新列中。

例如:

  (column1)
Coke Can 300ml
Bottle 800ml
Cup
Bucket 2000ml

变成:

(column1)          (column2)
 Coke Can            300ml
 Bottle              800ml
 Cup                 N/A
 Bucket              20000ml

基本上,我想用“xxml”提取每个短语并将其插入到新列中。感谢您的帮助!

【问题讨论】:

标签: python pandas


【解决方案1】:

使用pandas.extractall 提取到各个列中。

import pandas as pd
df = pd.DataFrame(dict(
    col1 = ['Coke Can 300ml', 'Bottle 800ml', 'Cup', 'Bucket 2000ml']))
print(df.to_markdown())
|    | col1           |
|---:|:---------------|
|  0 | Coke Can 300ml |
|  1 | Bottle 800ml   |
|  2 | Cup            |
|  3 | Bucket 2000ml  |

import re
df=df['col1'].str.extractall('([a-z ]+)(\d+)?([a-z]+)?',flags=re.I)
print(df.to_markdown())

|        | 0        |    1 | 2   |
|:-------|:---------|-----:|:----|
| (0, 0) | Coke Can |  300 | ml  |
| (1, 0) | Bottle   |  800 | ml  |
| (2, 0) | Cup      |  nan | nan |
| (3, 0) | Bucket   | 2000 | ml  |

【讨论】:

    【解决方案2】:

    使用 pandas str extract 搜索后跟 'ml' 的数字

      df['(column2)'] = df.iloc[:,0].str.extract(r'(\d+ml)')
    
        (column1)      (column2)
    0   Coke Can 300ml  300ml
    1   Bottle 800ml    800ml
    2   Cup             NaN
    3   Bucket 2000ml   2000ml
    

    如果要删除数字后的“ml”,可以使用正则表达式查找断言...它只会在数字后查找“ml”并将其替换为空字符串

    df.iloc[:,0] = df.iloc[:,0].str.replace('(?<=\d)ml','')
    
        (column1)   (column2)
    0   Coke Can 300    300ml
    1   Bottle 800      800ml
    2   Cup             NaN
    3   Bucket 2000     2000ml
    

    【讨论】:

    • 谢谢!这行得通。现在,有没有办法删除原始列中的 ml 值?
    • 添加了一个解决方案来涵盖删除数字后的“ml”值
    【解决方案3】:

    给定

    df = pd.DataFrame(dict(
        col1 = ['Coke Can 300ml', 'Bottle 800ml', 'Cup', 'Bucket 2000ml'])
    )
    

    以下内容可能是您想要的:

    In [13]: df.col1.str.split(' ', expand=True, n = 1)
    Out[13]:
            0          1
    0    Coke  Can 300ml
    1  Bottle      800ml
    2     Cup       None
    3  Bucket     2000ml
    

    但是,这是在列值右侧的第一个空格处拆分。

    为此,您从@sammywemmy 获得的答案似乎是最好的,我只是将其放在这里,因为它可能会引起您的兴趣。

    【讨论】:

      【解决方案4】:

      你可能想试试这个。

      df['new_column'] = df['column'].apply(lambda x: x.split()[-1] if len(x.split()) > 1 else None) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-07
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 2021-11-11
        • 2020-05-10
        • 2019-04-08
        相关资源
        最近更新 更多