根据列表中的项目分割DataFrame中的列。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据列表中的项目分割DataFrame中的列。相关的知识,希望对你有一定的参考价值。

我有以下表格,想把每一行分成三列:州、邮编和城市。州和邮编很简单,但我无法提取城市。我想过将每个字符串拆分在街道同义词之后,状态之前,但我似乎弄错了循环,因为它只会使用我列表中的最后一项。

输入数据。

    Address Text
0   11 North Warren Circle Lisbon Falls ME 04252
1   227 Cony Street Augusta ME 04330
2   70 Buckner Drive Battle Creek MI
3   718 Perry Street Big Rapids MI
4   14857 Martinsville Road Van Buren MI
5   823 Woodlawn Ave Dallas TX 75208
6   2525 Washington Avenue Waco TX 76710
7   123 South Main St Dallas TX 75201

我想实现的输出(所有的行,但为了节省时间,我只写出了前两行)。

    City          State    Postcode 
0   Lisbon Falls  ME       04252
1   Augusta       ME       04330

我的代码。

# Extract postcode and state
df["Zip"] = df["Address Text"].str.extract(r'(d{5})', expand = True)
df["State"] = df["Address Text"].str.extract(r'([A-Z]{2})', expand = True)

# Split after these substrings
street_synonyms = ["Circle", "Street", "Drive", "Road", "Ave", "Avenue", "St"]

# This is where I got stuck
df["Syn"] = df["Address Text"].apply(lambda x: x.split(syn))
df
答案

这里有一个方法。

import pandas as pd

# data
df = pd.DataFrame(
    ['11 North Warren Circle Lisbon Falls ME 04252',
     '227 Cony Street Augusta ME 04330',
     '70 Buckner Drive Battle Creek MI',
     '718 Perry Street Big Rapids MI',
     '14857 Martinsville Road Van Buren MI',
     '823 Woodlawn Ave Dallas TX 75208',
     '2525 Washington Avenue Waco TX 76710',
     '123 South Main St Dallas TX 75201'],
    columns=['Address Text'])

# Extract postcode and state
df["Zip"] = df["Address Text"].str.extract(r'(d{5})', expand=True)
df["State"] = df["Address Text"].str.extract(r'([A-Z]{2})', expand=True)

# Split after these substrings
street_synonyms = ["Circle", "Street", "Drive", "Road", "Ave", "Avenue", "St"]


def find_city(address, state, street_synonyms):
    for syn in street_synonyms:
        if syn in address:
            # remove street
            city = address.split(syn)[-1]
            # remove State and postcode
            city = city.split(state)[0]
            return city


df['City'] = df.apply(lambda x: find_city(x['Address Text'], x['State'], street_synonyms), axis=1)

print(df[['City', 'State', 'Zip']])

"""
             City State    Zip
0   Lisbon Falls     ME  04252
1        Augusta     ME  04330
2   Battle Creek     MI    NaN
3     Big Rapids     MI    NaN
4      Van Buren     MI  14857
5         Dallas     TX  75208
6       nue Waco     TX  76710
7         Dallas     TX  75201
"""

以上是关于根据列表中的项目分割DataFrame中的列。的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Pandas 中的列表过滤 DataFrame 中的项目?

将 Pandas DataFrame 中的列组合到 DataFrame 中的列表列

有啥方法可以扩展包含列表的 pandas Dataframe 中的列并从列表值本身中获取列名?

根据列表计算DataFrame中的匹配值

当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError

在不使用 UDF 的情况下基于映射转换 Spark DataFrame 中的列