考虑下面的数据框。
data = [
("flat 1 35 rosendale road, london","rosendale road"),
("34 hackney road, london","hackney road"),
("33-45 london road, london", "london road")
]
df = pd.DataFrame(data=data, columns=['addr', 'street'])
addr street
0 flat 1 35 rosendale road london rosendale road
1 34 hackney road, london hackney road
2 33-45 london road, london london road
我正在尝试生成一个最终系列,该系列将根据系列 addr
拆分系列 street
中每一行的文本,仅保留第一个左侧拆分。所需的输出如下:
0 flat 1 35
1 34
2 33-45
所以我只能通过循环来实现这一点(见下文)。关于如何防止循环(或使用轴 = 1 应用)的任何建议?
# list comp solution
splits = pd.Series([
row.addr.split(row.street)[0]
for row in df.itertuples()
])
pd.__version__ -> 1.2.3
答案 0 :(得分:1)
p=df['street'].str.split('\s').str.join('| ').str.cat(sep=' | ')
df.addr.str.replace(f'\s+{p}',"")
0 flat 1 35,
1 34,
2 33-45,
答案 1 :(得分:1)
如果您真的想正确地做到这一点,即一种更稳健的方法,可以在更多样的示例上运行良好,那么可能值得研究 NLP 方法——用于自然语言处理的机器学习——尤其是序列模型。
>我注意到有一个用于解析澳大利亚街道地址的 Python 包:
也许还有其他的,或者您可以建立自己的!
如果有人有其他适用的软件包/工具,我可以将它们添加到此列表中。
答案 2 :(得分:1)
这将为您提供数据集的预期结果,但我不确定此解决方法是否完全适合您的需要。
df['addr'].str.extract('(^(.*)\d+)')[0]
或
df['addr'].replace(df['street'].tolist(),'',regex=True).str.split(' , ').str[0]
答案 3 :(得分:0)
L = []
for k,v in zip(df.addr, df.street):
L.append(k.split(v))
output = [v[0] for v in L]
答案 4 :(得分:0)
您也可以在不使用循环的情况下实现这一点。
df.apply(lambda x: x['addr'].split(x['street'])[0], axis=1)
答案 5 :(得分:0)
def func(row):
last_index = row["addr"].index(row["street"])
return row["addr"][:last_index].strip()
df.apply(lambda x : func(x), axis=1)