【问题标题】:Splitting a column in a DataFrame based on multiple possible delimiters根据多个可能的分隔符拆分 DataFrame 中的列
【发布时间】:2019-03-18 13:21:12
【问题描述】:

我在 pandas 的数据框中有一个地址列,其中包含 3 种类型的信息,即街道、殖民地和城市。

三个值有两个可能的分隔符 - ',' 或空格,例如它可以是 Street1,Colony1,City1Street1 Colony1 City1

我需要将此列拆分为三个,分别带有标签'Street''Colony''City',并相应地拆分此Address 列中的值。

什么是最有效的方法,因为 pandas split 函数只允许您使用单个分隔符或正则表达式(可能是正则表达式,因为我不太擅长正则表达式)。

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    如果您确定它是逗号, 或空格,您可以使用:

    df[['Street','Colony','City']] = df.address.str.split('[ ,]', expand=True)
    

    解释: str.split 接受一个 pat(模式)参数:字符串或 正则表达式 进行分割。如果未指定,则在空格处拆分。使用我们可以传递正则表达式的事实,这变得很容易,因为正则表达式中的[ ,] 表示,

    另一种方法是使用' |,',或者如果您可以有多个空格'\s+|,'


    完整示例:

    import pandas as pd
    
    df = pd.DataFrame({
        'address': ['a,b,c','a b c']
    })
    
    df[['Street','Colony','City']] = df.address.str.split('[ ,]', expand=True)
    
    print(df)
    

    返回:

      address Street Colony City
    0   a,b,c      a      b    c
    1   a b c      a      b    c
    

    【讨论】:

      【解决方案2】:

      试试这个

      df[['Street','Colony','City']] = df.address.apply(lambda x: pd.Series(re.split('\W',x)))
      

      \W 将匹配任何不是单词字符的字符。见docs

      【讨论】:

        【解决方案3】:

        实现此目的的一种方法是使用re.sub 来合并您的分隔符,然后在该单个分隔符上使用str.split 来创建您的新列。

        import pandas as pd 
        import re
        
        df = pd.DataFrame({'address':['Street1,Colony1,City1',  'Street2 Colony2 City2']})
        
        location_df = (df.address
                         .apply(lambda x: pd.Series(re.sub(pattern=' |,', 
                                                           repl=',', 
                                                           string=x).split(','), 
                                                    index=['street','colony','city']))
                        )
        

        【讨论】:

          猜你喜欢
          • 2018-12-27
          • 2013-10-19
          • 1970-01-01
          • 2013-02-27
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多