excel 是否可以使用Python编程清理这些数据?

waxmsbnn  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(77)

我正在寻找一种更快的方法来清理一个体面的大小的电子表格中的数据(5- 15 k行之间)的问题,我一直遇到的是,数据是在这样的穷人形状它采取了我的年龄,实际上只是使用Excel/SQL清理它。老实说,我对python了解不多,但我真的很有兴趣学习,以帮助我使我的工作更容易。
这是我需要清理的数据的一个示例。即使它让我走了50%的路,它也会保存我的时间。

| Place | Address | City | State | Zip |

|Burger King Hartford, CT | 123 Apple St W|--|--|--|        
|McDonald's| 5 Big Mac dr | New York, NY 10001|--|--|       
|Arby's|--| Sturgis, KY |--|--|         
|Taco Bell|--| Grand Rapids MI 49501 |--|--|        
|Jimmy Johns|--| Fort Wayne, IN. 46774 |--|--|

字符串
我想过两种不同的方法来解决这个问题,但我不确定它们是否可行。如果你认为他们中的任何一个是可能的,或者如果你有一个想法,将工作得更好,我会非常感激。
我的第一个想法是在dataframe中的每个字符串中搜索一个特定的子字符串,该子字符串将是所有州缩写(MI,IN,KY等)的列表。如果找到其中一个子字符串,则移动到状态列。邮政编码也是如此,但由于有47,000个左右的邮政编码,我不知道这有多容易。
我的第二个想法是使用python中的split()函数,首先用,分隔符分隔列,这将使我得到类似于下面的结果

| Place | Address | City | State | Zip |

|Burger King Hartford  | 123 Apple St W|--|CT|--|       
|McDonald's| 5 Big Mac dr | New York |NY 10001|--|      
|Arby's|--| Sturgis |KY|--|         
|Taco Bell|--| Grand Rapids MI 49501 |--|--|        
|Jimmy Johns|--| Fort Wayne |IN. 46774|--|


然后再次使用split函数在新填充的状态字段中的空白处进行拆分。这不会帮助我与大急流城MI 49015,因为它只由空间和大和急流分隔将分裂以及,但它会让我相当接近完美。
有什么关于函数的建议吗?我应该仔细阅读或者思考如何以不同的方式处理这个问题?

ifmq2ha2

ifmq2ha21#

以下是在Python中清理此电子表格数据的一些建议:
将数据加载到Pandas数据框中。这将使操作和处理数据更容易。

import pandas as pd
df = pd.read_csv('data.csv') # or whatever source

字符串
使用Series.str.extract()等字符串方法将州缩写和邮政编码提取到新列中:

df['State'] = df['Address'].str.extract(r'([A-Z]{2})')
df['Zip'] = df['Address'].str.extract(r'(\d{5})')


使用Series.str.split()以逗号分隔Address列。然后使用第二个元素提取城市名称:

df['City'] = df['Address'].str.split(',').str[1]


通过使用Series.str.replace()删除额外的文本来清理Place名称:

df['Place'] = df['Place'].str.replace('[^A-Za-z\s]+', '')


使用Series.fillna()和Series.str.strip()填充缺少的值并修剪多余的空格:

df = df.fillna('').applymap(str.strip)


当您希望使用字符串方法进行清理时,可以使用regex

xzlaal3s

xzlaal3s2#

使用您的示例数据,我可以将其标准化为list

[['Burger King Hartford', '123 Apple St W', '--', 'CT', '--'],
 ["McDonald's", '5 Big Mac dr', 'New York', 'NY', '10001'],
 ["McDonald's", '5 Big Mac dr', 'New York', 'NY', '10001'],
 ["Arby's", '--', 'Sturgis', 'KY', '--'],
 ['Taco Bell', '--', 'Grand Rapids', 'MI', '49501'],
 ['Taco Bell', '--', 'Grand Rapids', 'MI', '49501'],
 ['Jimmy Johns', '--', 'Fort Wayne', 'IN', '46774'],
 ['Jimmy Johns', '--', 'Fort Wayne', 'IN', '46774']]

字符串
代码:

import io, pprint

csv_file = """\
| Place | Address | City | State | Zip |
|Burger King Hartford, CT | 123 Apple St W|--|--|--|
|McDonald's| 5 Big Mac dr | New York, NY 10001|--|--|
|McDonald's| 5 Big Mac dr | New York, NY|--|10001|
|Arby's|--| Sturgis, KY |--|--|
|Taco Bell|--| Grand Rapids MI 49501 |--|--|
|Taco Bell|--| Grand Rapids | MI 49501 |--|
|Jimmy Johns|--| Fort Wayne, IN. 46774 |--|--|
|Jimmy Johns|--| Fort Wayne | IN | 46774 |"""

states = [ 'AK', 'AL', 'AR', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'GA',
           'HI', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA', 'MA', 'MD', 'ME',
           'MI', 'MN', 'MO', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM',
           'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX',
           'UT', 'VA', 'VT', 'WA', 'WI', 'WV', 'WY']

with io.StringIO(csv_file) as file:
    parsed_data = []
    headers = file.readline() # skip headers
    for line in file:
        remainder = ''
        place, address, city, state, zipcode = \
            line.replace('.', '').replace(',', '').strip('\n|').split('|')
        if state == '--':
            for i in states:
                if   i in place:
                    place, state, remainder = place.partition(i)
                    break
                elif i in address:
                    address, state, remainder = address.partition(i)
                    break
                elif i in city:
                    city, state, remainder = city.partition(i)
                    break
            if zipcode == '--' and remainder.strip(): zipcode = remainder
        else:
            try: state, zipcode = state.split()
            except ValueError: pass
        row = list(map(str.strip, (place, address, city, state, zipcode)))
        parsed_data.append(row)

pprint.pp(parsed_data)

相关问题