基于 Condition Pandas Dataframe 拆分列数据

BLi*_*exe 5 dataframe python-3.x pandas

我有一个大数据集,正在寻找可以将我的街道地址分成两列Street NumberStreet 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 中对其进行编码。

伪代码:

  1. 根据遇到非数字字符的第一个空格将地址拆分为两列: street_data = address.split(" ", maxsplit=1)

  2. 如果 street_data[0] 有数字,则以这种方式返回列:

      df[street_number] = street_data[0]
      df[street_name] = street_data[1]
Run Code Online (Sandbox Code Playgroud)
  1. 否则,如果 street_data[0] 不是数字,则以这种方式返回列:
      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)