【问题标题】:Extract last term after comma into new column将逗号后的最后一项提取到新列中
【发布时间】:2018-09-14 13:24:34
【问题描述】:

我有一个基本上是 2 列和 9000 行的 pandas 数据框

CompanyName  |  CompanyAddress

地址在表格中

Line1, Line2, ..LineN, PostCode

即字符串(或 dtype 'object')中逗号分隔项目的数量基本上不同,我只想提取邮政编码,即字段中最后一个逗号之后的项目

我已经尝试了Dot notation string manipulation 的建议(可能很糟糕):

df_address['CompanyAddress'] = df_address['CompanyAddress'].str.rsplit(', ') 

它只是在字段周围放置了 '[ ]' - 我没有成功尝试隔离任何拆分/分区字符串的最后一个组件,maxsplit 引发错误。

在 EdChums 对Pandas split Column into multiple columns by comma 的评论之后,我取得了一定程度的成功

pd.concat([df_address[['CompanyName']], df_address['CompanyAddress'].str.rsplit(', ', expand=True)], axis=1)

但是,在隔离邮政编码的同时,这只会创建多个列,并且邮政编码在第 3-6 列中......同样不好。

感觉非常接近,请指教。

    EmployerName    Address
0   FAUCET INN LIMITED  [Union, 88-90 George Street, London, W1U 8PA]
1   CITIBANK N.A    [Citigroup Centre,, Canary Wharf, Canada Squar...
2   AGENCY 2000 LIMITED     [Sovereign House, 15 Towcester Road, Old Strat...
3   Transform Trust     [Unit 11 Castlebridge Office Village, Kirtley ...
4   R & R.C.BOND (WHOLESALE) LIMITED    [One General Street, Pocklington Industrial Es...
5   MARKS & SPENCER FINANCIAL SERVICES PLC  [Marks & Spencer Financial, Services Kings Mea...

【问题讨论】:

    标签: python string pandas split


    【解决方案1】:

    只需rssplit 将现有列分成 2 列 - 现有列和新列。或者,如果您想保持现有列不变,可以添加两个新列。

    df['Address'], df['PostCode'] = df['Address'].str.rsplit(', ', 1).str
    

    编辑:由于 OP 的地址列是一个包含 1 个字符串的列表,因此这里有一个专门的解决方案:

    df['Address'], df['PostCode'] = df['Address'].map(lambda x: x[0]).str.rsplit(', ', 1).str
    

    【讨论】:

    • 这给了AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
    • 嗯,适用于我的示例 df。你是什​​么类型的专栏?
    • 两列都是dtype对象(显然)
    • 你确定你所有的行都有正确的值吗?看起来你那里有一些空行或其他东西。
    • 运行np.where(pd.isnull(df))返回(array([], dtype=int32), array([], dtype=int32));所以我觉得没关系
    【解决方案2】:

    给定 DataFrame,

    df = pd.DataFrame({'Name': ['ABC'], 'Address': ['Line1, Line2, LineN, PostCode']})
    
        Address                         Name
    0   Line1, Line2, LineN, PostCode   ABC
    

    如果您只需要邮政编码,您可以使用 rsplit 提取它并将其重新分配给列地址。它将为您省去 concat 的步骤。

    df['Address'] = df['Address'].str.rsplit(',').str[-1] 
    

    你得到

        Address     Name
    0   PostCode    ABC
    

    编辑:假设您在列表中有地址值的数据框

    df = pd.DataFrame({'Name': ['FAUCET INN LIMITED'], 'Address': [['Union, 88-90 George Street, London, W1U 8PA']]})
    
        Address                                         Name
    0   [Union, 88-90 George Street, London, W1U 8PA]   FAUCET INN LIMITED
    

    您可以使用

    获取最后一个元素
    df['Address'] = df['Address'].apply(lambda x: x[0].split(',')[-1])
    

    你得到

        Address     Name
    0   W1U 8PA     FAUCET INN LIMITED
    

    【讨论】:

    • 嗨 - 不幸的是,这给了我与 Joe Samanek 相同的错误:AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas - 我的数据类型中是否缺少某些内容?
    • 你能发布 df_address['CompanyAddress'].head() 吗?
    【解决方案3】:

    rsplit 返回一个列表,尝试 rsplit(',')[0] 获取源代码行中的最后一个元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多