【问题标题】:how to extract numbers from a string that starts with numbers in a column using python如何使用python从以列中的数字开头的字符串中提取数字
【发布时间】:2020-04-15 00:04:42
【问题描述】:

我是 Python 新手,我有一个数据框,我想从中提取字符串开头的数字。例如:

import numpy as np
import pandas as pd
Test = {'Text': ['/CY1000 HZ 23 Street Arizona','/3456 BZ 33 Rue Avenue France','/2222 6th Street Madrid', np.nan],
    'Price': [22000,25000,27000,35000]}
df = pd.DataFrame(Test,columns= ['Text', 'Price'])

我想将 1000,3456,2222,NaN 放在另一列中,并将其余文本放在另一列中

Test = {'Text': ['/CY1000 HZ 23 Street Arizona','/3456 BZ 33 Rue Avenue France','/2222 6th Street Madrid', np.nan],
        'Text1': ['1000','3456','2222',np.nan],
    'Price': [22000,25000,27000,35000],
     'Text2': [ 'HZ 23 Street Arizona', 'BZ 33 Rue Avenue France','6th Street Madrid', 'Nan']}
df = pd.DataFrame(Test,columns= ['Text', 'Text1','Text2','Price'])

提前致谢

【问题讨论】:

    标签: python regex string dataframe


    【解决方案1】:

    这会让你得到数字:

    ^(?:[^0-9]+)?([0-9]+)
    

    你想要的数据会在\1里面

    https://regex101.com/r/i4YfeV/1

    【讨论】:

    • 谢谢,它工作得很好,但是有没有办法像你一样拆分并拥有 Text1 和另一列,其中包括 ['HZ 23 Street Arizona','BZ 33 Rue Avenue France' ,'6th Street Madrid','Nan'] 没有我们提取的数字?
    • @Yagmur 是的,我确信 Python 有办法做到这一点,但我不是 Python 程序员。您应该能够提取数字并将其放入数据框中,然后使用某种替换并将其余部分保存到单独的数据框中
    【解决方案2】:

    您使用此代码从字符串中提取数字。

        import re
        Test = {'Text': ['/CY1000 HZ 23 Street Arizona','/3456 BZ 33 Rue Avenue France','/2222 6th Street Madrid'],
            'Price': [22000,25000,27000,35000]}
        print(Test['Text'])
        temp = re.findall(r'^(?:[^0-9]+)?([0-9]+)', Test['Text'][0]) 
        print(temp)
        temp1 = re.findall(r'^(?:[^0-9]+)?([0-9]+)', Test['Text'][1]) 
        print(temp1)
    

    输出将是:

    [1000]
    [3456]
    

    【讨论】:

    • 非常感谢。我还有什么方法可以拆分并像您一样拥有 Text1 和另一列,其中包括 ['HZ 23 Street Arizona','BZ 33 Rue Avenue France','6th Street Madrid','Nan'] 没有我们提取的数字?
    • 你也想处理 NAN 吗?
    • 是的,因为可能存在不以数字开头的情况。谢谢
    【解决方案3】:
    Test = {'Text': ['/CY1000 HZ 23 Street Arizona','/3456 BZ 33 Rue Avenue France','/2222 6th Street Madrid', np.nan],
        'Price': [22000,25000,27000,35000]}
    df = pd.DataFrame(Test,columns= ['Text', 'Price'])
    
    vals= []
    for x in df.Text:
        if x is np.nan:
            x=""
        num = re.findall(r'\d+',x)
        if len(num)>0:
            vals.append(num[0])
        else:
            vals.append(np.nan)
    
    print(vals)
    
    df['Text1'] = vals
    print(df)
    

    输出:

    ['1000', '3456', '2222', nan]
                                Text  Price Text1
    0   /CY1000 HZ 23 Street Arizona  22000  1000
    1  /3456 BZ 33 Rue Avenue France  25000  3456
    2        /2222 6th Street Madrid  27000  2222
    3                            NaN  35000   NaN
    

    [编辑] 如果对于正则表达式,您可以使用:

    '/?([A-Z]+)?([0-9]+){1}'
    

    比赛将在第 2 组,即 /2。

    [EDIT2] 如果对于正则表达式,您可以使用它来仅提取地址(基于评论):

    '/?([A-Z]+)?([0-9]+){1} ([0-9A-Za-z ]+)'
    

    比赛将在第 3 组,即 /3。

    【讨论】:

    • 非常感谢。我还有什么方法可以拆分并像您一样拥有 Text1 和另一列,其中包括 ['HZ 23 Street Arizona','BZ 33 Rue Avenue France','6th Street Madrid','Nan'] 没有我们提取的数字?
    • '/?([AZ]+)?([0-9]+){1} ([0-9A-Za-z ]+)' 使用此正则表达式并提取第 3 组,即/3.
    • 谢谢。但是,如果我有一行 ' Name_A Ltd 3 没有。 Street Madrid' 而不是 ''/2222 6th Street Madrid'' 那么你的代码给我 3 而不是 NaN。但是,它不应该给我,因为该行不是以 3 开头的。您知道是否有解决该问题的方法吗?
    • 我没有完全理解您要说的内容,您能否详细说明一下。
    • 很抱歉给您带来了困惑。即如果我的“文本”:['/CY1000 HZ 23 Street Arizona','/3456 BZ 33 Rue Avenue France','Name_A Ltd 3 no。 Street Madrid', np.nan] 并按照您的建议执行正则表达式 我会得到 [('CY', '1000', 'HZ 23 Street Arizona'), ('', '3456', 'BZ 33 Rue Avenue France '), ('', '3', '马德里'), nan]。但是,我想在我的第 2 组中有 1000,3456,Nan,Nan 在我的第 3 组中我应该有'HZ 23 Street Arizona','BZ 33 Rue Avenue France','Name_A Ltd 3 no。街道马德里',南。是不是更清楚了?
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多