【问题标题】:Split a column in pandas twice to multiple columns将pandas中的一列拆分为多列
【发布时间】:2018-06-13 18:56:08
【问题描述】:

我有一个包含完整地址的列“Nome_propriedade”,例如机构名称、街道、社区、城市和州

它总是以城市和州名结尾。使用这种模式:

Nome_propriedade
"Rod. BR 386, bairro Olarias/Conventos, Lajeado/RS"
"Fazenda da Várzea - zona rural, Serro/MG"
"Cidade do Rock - Jacarepaguá, Rio de Janeiro/RJ"
"Área de extração de carnaúba - Povoado Areal, zona rural, Santa Cruz do Piauí/PI"
"Pastelaria - Av. Vicente de Carvalho, 995, Loja Q, Vila da Penha, Rio de Janeiro/RJ"

我想创建两个新列,“city”和“state”,并用“Nome_propriedade”列中的最后一个值填充它们。我还想将这些从 Nome_propiedade 中剔除。

                           Nome_propriedade                 City State
      Rod. BR 386, bairro Olarias/Conventos              Lajeado    RS
             Fazenda da Várzea - zona rural                Serro    MG
            Cidade do Rock - Jacarepaguá...       Rio de Janeiro    RJ
Área de extração de carnaúba - Povoado A...  Santa Cruz do Piauí    PI
Pastelaria - Av. Vicente de Carvalho, 99...       Rio de Janeiro    RJ

请问有人知道如何创建这两列吗?

我无法进行一般拆分,因为我只想将城市和州信息分开。其他信息可能保持不变。

【问题讨论】:

  • 它们总是以逗号分隔和斜线分隔吗?
  • 谢谢。是的,最后它总是“,城市/州”。问题是在这之前还有其他逗号
  • @ReinaldoChaves 我进行了各种编辑以使问题更可重用。希望你不要介意! :)

标签: python pandas split


【解决方案1】:

你怎么看:

import pandas as pd
propiedades = ["Rod. BR 386, bairro Olarias/Conventos, Lajeado/RS",
               "Fazenda da Várzea - zona rural, Serro/MG",
               "Cidade do Rock - Jacarepaguá, Rio de Janeiro/RJ",
               "Área de extração de carnaúba - Povoado Areal, zona rural, Santa Cruz do Piauí/PI",
               "Pastelaria - Av. Vicente de Carvalho, 995, Loja Q, Vila da Penha, Rio de Janeiro/RJ"]
df = pd.DataFrame({"Nome_propriedade":propiedades})

df[["City", "State"]] = df["Nome_propriedade"].apply(lambda x :x.split(",")[-1]).str.split("/",
                                                                                           expand=True)

更新 如果您想从Nome_propriedade 中删除这些信息,您可以添加此行

df["Nome_propriedade"] = df["Nome_propriedade"].apply(lambda x :",".join(x.split(",")[:-1]))

【讨论】:

  • 谢谢大家。有效。但我现在才意识到,理想的情况也是,在创建列之后,删除“Nome_propriedade”列中备用的信息“, city/state”
  • @user32185, @ReinaldoChaves 这很好,但使用 str 您可以节省很多时间来避免应用。看看它。可能对未来有所帮助。
  • 您对apply 的使用是正确的。对于海量数据帧,您的解决方案肯定更好。
【解决方案2】:

您需要将列中的字符串按, 拆分,将列表中的最后一个元素用/ 拆分。该列表是您的两列。

pd.DataFrame(list(df['Nome_propriedade'].str.split(',').apply(lambda x: x[-1]).str.split('/')), columns=['city', 'state'])

输出:

                   city    state
0               Lajeado    RS
1                 Serro    MG
2        Rio de Janeiro    RJ
3   Santa Cruz do Piauí    PI
4        Rio de Janeiro    RJ

【讨论】:

    【解决方案3】:

    这是一个有效的解决方案,可以避免乏味的apply,而只需坚持使用str-operations

    df["Nome_propriedade"], x = df["Nome_propriedade"].str.rsplit(', ', 1).str
    df["City"], df['State'] = x.str.split('/').str
    

    完整示例:

    import pandas as pd
    
    propiedades = [
        "Rod. BR 386, bairro Olarias/Conventos, Lajeado/RS",
        "Fazenda da Várzea - zona rural, Serro/MG",
        "Cidade do Rock - Jacarepaguá, Rio de Janeiro/RJ",
        "Área de extração de carnaúba - Povoado Areal, zona rural, Santa Cruz do Piauí/PI",
        "Pastelaria - Av. Vicente de Carvalho, 995, Loja Q, Vila da Penha, Rio de Janeiro/RJ"
    ]
    
    df = pd.DataFrame({
        "Nome_propriedade":propiedades
    })
    
    df["Nome_propriedade"], x = df["Nome_propriedade"].str.rsplit(', ', 1).str
    df["City"], df['State'] = x.str.split('/').str
    
    # Stripping Nome_propriedade to len 40 to fit screen
    print(df.assign(Nome_propriedade=df['Nome_propriedade'].str[:40]))
    

    返回:

                               Nome_propriedade                 City State
    0     Rod. BR 386, bairro Olarias/Conventos              Lajeado    RS
    1            Fazenda da Várzea - zona rural                Serro    MG
    2              Cidade do Rock - Jacarepaguá       Rio de Janeiro    RJ
    3  Área de extração de carnaúba - Povoado A  Santa Cruz do Piauí    PI
    4  Pastelaria - Av. Vicente de Carvalho, 99       Rio de Janeiro    RJ
    

    如果您想保留这些物品:

    df["City"], df['State'] = df["Nome_propriedade"]\
                                .str.rsplit(', ', 1).str[-1]\ 
                                .str.split('/').str
    

    【讨论】:

      【解决方案4】:

      我能看到的最简单的方法是,举个例子:

      example = 'some, stuff, here, city/state'
      elements = example.split(',')
      city, state = elements[-1].split('/')
      

      要将其应用于数据框中的列:

      df['city_state'] = df.Nome_propriedade.apply(lambda r: r.split(',')[-1].split('/'))
      df['city'] = [cs[0] for cs in df['city_state']]
      df['state'] = [cs[1] for cs in df['city_state']]
      

      例如:

      example2 = 'another, thing here city2/state2'
      df = pd.DataFrame({'address': [example, example2],
                         'other': [1, 2]})
      df['city_state'] = df.address.apply(lambda r: r.split()[-1].split('/'))
      df['city'] = [cs[0] for cs in df['city_state']]
      df['state'] = [cs[1] for cs in df['city_state']]
      df.drop(columns=['city_state'], inplace=True)
      print(df)
      #                             address  other   city   state
      # 0     some, stuff, here, city/state      1   city   state
      # 1  another, thing here city2/state2      2  city2  state2
      

      注意:其他一些答案提供了一种更有效的方式来将结果解压缩到您的数据框中。我将把它留在这里,因为我认为把它分成几个步骤是说明性的,但为了效率起见,我会选择其他步骤。

      【讨论】:

      • 我觉得应该是:elements = example.split(',')
      • @Joe 我认为这并不重要,因为他只想获得城市和州。因为它们总是在最后,所以常规的str.split() 应该将它们分开,它们将成为结果列表中的最后一个元素。除非我从 OP 那里得到其他消息。
      • 对于像里约热内卢这样有空间的城市很重要
      • @Joe 好点!看起来我的答案与其他人的答案相同。正在删除。
      • 你先回答了,你可以离开它:)
      猜你喜欢
      • 2016-11-17
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2023-01-11
      • 2016-05-31
      • 1970-01-01
      相关资源
      最近更新 更多