BLi*_*exe 5 dataframe python-3.x pandas
我有一个大数据集,正在寻找可以将我的街道地址分成两列Street Number和Street Name.
我想弄清楚如何有效地做到这一点,因为我首先需要处理街道地址,然后检查拆分的第一个索引是否有数字。
到目前为止,我有一个看起来像这样的工作代码。我创建了两个函数,一个用于从街道地址中提取街道号码数据,而另一个函数则替换街道地址中第一次出现的街道号码。
def extract_street_number(row):
if any(map(str.isdigit, row.split(" ")[0])):
return row.split(" ")[0]
def extract_street_name(address, streetnumber):
if streetnumber:
return address.replace(streetnumber, "", 1)
else:
return address
Run Code Online (Sandbox Code Playgroud)
然后使用 apply 函数获得两列。
df[street_number] = df.apply(lambda row: extract_street_number(row[address_col]), axis=1)
df[street_name] = df.apply(lambda row: extract_street_name(row[address_col], row[street_number]), axis=1)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更有效的方法来做到这一点?基于此当前例程,在处理街道名称列之前,我需要先构建街道编号列。
我正在考虑在地址列的第一次迭代中构建两个系列。伪代码是这样的,我只是不知道如何在 python 中对其进行编码。
伪代码:
根据遇到非数字字符的第一个空格将地址拆分为两列:
street_data = address.split(" ", maxsplit=1)
如果 street_data[0] 有数字,则以这种方式返回列:
df[street_number] = street_data[0]
df[street_name] = street_data[1]
Run Code Online (Sandbox Code Playgroud)
df[street_number] = ""
df[street_name] = street_data[0] + " " + street_data[1]
# or just simply the address
df[street_name] = address
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这是数据的工作样本:
# In
df = pd.DataFrame({'Address':['111 Rubin Center', 'Monroe St', '513 Banks St', '5600 77 Center Dr', '1013 1/2 E Main St', '1234C Main St', '37-01 Fair Lawn Ave']})
# Out
Street_Number Street_Name
0 111 Rubin Center
1 Monroe St
2 513 Banks St
3 560 77 Center Dr
4 1013 1/2 E Main St
5 1234C Main St
6 37-01 Fair Lawn Ave
Run Code Online (Sandbox Code Playgroud)
小智 0
solution reflecting your pseudocode is below. First lets divide "Address" and store is somewhere
new = df["Address"].str.split(" ", n = 1, expand = True)
df["First Part"]= new[0]
df["Last Part"]= new[1]
Run Code Online (Sandbox Code Playgroud)
Next let's write down conditions
cond1 = df['First Part'].apply(str.isdigit)
cond2 = df['Last Part'].apply(str.isdigit)
Run Code Online (Sandbox Code Playgroud)
Now check what meets given conditions
df.loc[cond1 & ~cond2, "Street"] = df.loc[cond1 & ~cond2, "Last Part"]
df.loc[cond1 & ~cond2, "Number"] = df.loc[cond1 & ~cond2, "First Part"]
df.loc[~cond1 & ~cond2, "Street"] = df.loc[~cond1 & ~cond2, ['First Part', 'Last Part']].apply(lambda x: x[0] + ' ' + x[1], axis = 1)
Run Code Online (Sandbox Code Playgroud)
Finally let's clean-up those auxiliary columns
df.drop(["First Part", "Last Part"], axis = 1, inplace=True)
df
Address Street Number
0 111 Rubin Center Rubin Center 111
1 Monroe St Monroe St NaN
2 513 Banks St Banks St 513
Run Code Online (Sandbox Code Playgroud)