【问题标题】:How to filter census data (From API) with a created list of zipcodes?如何使用创建的邮政编码列表过滤人口普查数据(来自 API)?
【发布时间】:2019-09-01 05:17:27
【问题描述】:

我使用人口普查包装器从人口普查 api 中提取数据,我想用我编译的 zip 列表过滤掉这些数据。

所以我试图从人口普查的拉取请求数据中过滤数据。我有一个我想要使用的 zip 的 csv 文件,我已经将它放入列表中。我尝试了一些方法,例如将人口普查放入数据框中并尝试按列表过滤邮政编码列,但我认为我的语法不正确。

这只是我拉的测试数据,

census_data = c.acs5.get(('NAME', 'B25034_010E'),
           {'for': 'zip code tabulation area:*'})
census_pd = census_pd.rename(columns={"NAME": "Name", "zip code tabulation area": "Zipcode"})

censusfilter = census_pd['Zipcode'==ziplst]

所以我尝试了这种方式,并且我尝试了一个 for 循环,在该循环中我使用 census_pd['Zipcode'] 和一个内部 for 循环以使用 if 语句(如 zip1 == zip2 附加到列表)遍历列表。

我的依赖

# Dependencies

import pandas as pd
import requests
import json
import pprint
import numpy as np
import matplotlib.pyplot as plt
import requests
from census import Census
import gmaps
from us import states

# Census & gmaps API Keys
from config import (api_key, gkey)
c = Census(api_key, year=2013)

# Configure gmaps
gmaps.configure(api_key=gkey)

如前所述,我想过滤掉我可能从特定于我使用的邮政编码的人口普查数据中提取的任何数据

【问题讨论】:

    标签: python pandas api census


    【解决方案1】:

    尚不清楚您的数据是什么样的。我猜您有一个标量列,并且您想使用列表过滤该列。如果是问题,那么您可以使用isin 内置方法来过滤数据框。

    import pandas as pd
    
    data = {'col': [2, 3, 4], 'col2': [1, 2, 3], 'col3': ["asd", "ads", "asdf"]}
    df = pd.DataFrame.from_dict(data)
    random_list = ["asd", "ads"]
    
    df_filtered = df[df["col3"].isin(random_list)]
    

    【讨论】:

    • 哇,当我回来时我必须尝试这个,我实际上继续做了第一个解决方案,即将列表转换为数据框然后合并。之后,我删除了所有 NaN 值并使用我想要的模板获得了一个 df
    • 因此,一旦我将一帧转换为相同的 dtype,这实际上就起作用了。这样做的线条更少,看起来更干净!
    【解决方案2】:

    示例数据不是很清楚,所以下面是如何使用要过滤的值列表来过滤列上的数据框

    import pandas as pd
    from io import StringIO
    
    # Example data
    df = pd.read_csv(StringIO(
    '''zip,some_column
    "01234",A1
    "01234",A2
    "01235",A3
    "01236",B1
    '''), dtype = {"zip": str})
    
    zips_list = ["01234", "01235"]
    
    # using a join
    zips_df = pd.DataFrame({"zip": zips_list})
    df1 = df.merge(zips_df, how='inner', on='zip')
    print(df1)
    
    # using query
    df2 = df.query('zip in @zips_list')
    print(df2)
    
    
    # using an index
    df.set_index("zip", inplace=True)
    df3=df.loc[zips_list]
    print(df3)
    

    所有情况下的输出:

         zip some_column
    0  01234          A1
    1  01234          A2
    2  01235          A3
    

    【讨论】:

    • 我什至没有考虑将列表转换为数据框,我能够合并然后删除所有未排列的值,因此这对我有用。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2017-01-27
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多