我有一个列“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
请有人知道如何创建这两列吗?
我不能做一般的分裂,因为我只是想分开城市和州的信息。其他信息可能保持不变。
答案 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
注意:其他一些答案提供了一种将结果解压缩到数据框中的更有效方法。我将此留在这里因为我认为将其分解为步骤是说明性的,但为了效率,我会选择其中一个。