将pandas中的列拆分两次到多列

时间:2018-06-13 18:56:09

标签: python pandas split

我有一个列“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

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

我不能做一般的分裂,因为我只是想分开城市和州的信息。其他信息可能保持不变。

4 个答案:

答案 0 :(得分:3)

您需要将列中的字符串拆分为,,然后删除列表中的最后一个元素并将其拆分为/。那个清单是你的两个专栏。

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

答案 1 :(得分:3)

您如何看待:

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]))

答案 2 :(得分:2)

这是一个有效的解决方案,可以避免繁琐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

答案 3 :(得分:1)

我能看到的最简单的方法就是一个例子:

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

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