熊猫根据同一数据帧中的另一个系列拆分一个系列

时间:2021-06-10 22:50:51

标签: python pandas

考虑下面的数据框。

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

6 个答案:

答案 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)
相关问题