Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从人口普查下载数据块,如何连接到多个CSV以不超过内存_Python_Pandas_Census - Fatal编程技术网

Python 从人口普查下载数据块,如何连接到多个CSV以不超过内存

Python 从人口普查下载数据块,如何连接到多个CSV以不超过内存,python,pandas,census,Python,Pandas,Census,假设我有一个从人口普查数据下载的api键列表 例如: variable_list = [ 'B08006_017E', 'B08016_002E', 'B08016_003E', 'B08016_004E', ... ] 现在给出了将这些数据放入一个csv文件的内存限制。我想创建一种方法,将变量列表中的100个变量块放置到多个csv文件中。例如,若我有200个变量,那个么我会有两个csv文件,第一个是100个变量,第二个是100个变量。我希望这是清楚的 以下是我目前下载数据的方式: impor

假设我有一个从人口普查数据下载的api键列表

例如:

variable_list = [
'B08006_017E',
'B08016_002E',
'B08016_003E',
'B08016_004E',
...
]
现在给出了将这些数据放入一个csv文件的内存限制。我想创建一种方法,将变量列表中的100个变量块放置到多个csv文件中。例如,若我有200个变量,那个么我会有两个csv文件,第一个是100个变量,第二个是100个变量。我希望这是清楚的

以下是我目前下载数据的方式:

import pandas as pd
import censusdata
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.precision', 2)
#import statsmodels.formula.api as sm
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import censusgeocode as cg
import numpy as np
from numbers import Number
import plotly
import matplotlib.pyplot as plt
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
import requests
import pandas
import geopandas
import json
import math
from haversine import haversine
from ipfn import ipfn
import networkx
from matplotlib import pyplot
from matplotlib import patheffects
from shapely.geometry import LineString, MultiLineString

variable_list1 = [
'B08006_017E',
'B08016_002E'
'B08016_003E',
'B08016_004E'
]

all_variable_lists = [variable_list1]
print(len(all_variable_lists[0]))
#2) For each year, download the relevant variables for each tract
def download_year(year,variable_list,State,County,Tract):
    df = censusdata.download('acs5', year, censusdata.censusgeo([('state',State),('county',County),('tract',Tract)]), variable_list, key = 'e39a53c23358c749629da6f31d8f03878d4088d6')
    df['Year']=str(year)
    return df
#3) Define function to download for a single year and state 
def callback_arg(i,variable_list,year):
    try:        
        print('Downloading - ',year,'State', i,' of 57')
        if i<10:
            df = download_year(year,variable_list,'0'+str(i),'*','*')
            return df
        if i==51:
            df = download_year(year,variable_list,str(i),'*','*')
            return df
        else:
            df = download_year(year,variable_list,str(i),'*','*')
            return df
    except:
        pass

#3) Function to download for all states and all years, do some slight formatting
def download_all_data(variable_list,max_year):
    df=download_year(2012,variable_list,'01','*','*')
    for year in range(2012,max_year+1):
        if year == 2012:
            for i in range(0,57):
                df=df.append(callback_arg(i,variable_list,year))
        else: 
            for i in range(0,57):
                df=df.append(callback_arg(i,variable_list,year))
    df2=df.reset_index()
    df2=df2.rename(columns = {"index": "Location+Type"}).astype(str)
    df2['state']=df2["Location+Type"].str.split(':').str[0].str.split(', ').str[2]
    df2['Census_tract']=df2["Location+Type"].str.split(':').str[0].str.split(',').str[0].str.split(' ').str[2][0]
    df2['County_name']=df2["Location+Type"].str.split(':').str[0].str.split(', ').str[1]
    return(df2)
#4) Some slight formatting
def write_to_csv(df2,name = 'test'):
    df2.to_csv(name)
#5) The line below is commented out, but should run the entire download sequence
def write_to_csv(df, ide):
    df.to_csv('test' + str(ide) + '.csv')

list_of_dfs = []
for var_list in all_variable_lists:
    list_of_dfs.append(download_all_data(var_list, 2012))
x1 = list_of_dfs[0].reset_index()
# x3 = pd.merge(x1,x2, on=['index','Location+Type','Year','state','Census_tract','County_name'])
write_to_csv(x1,1)

如果有人能给我一些如何实现我想要的想法,这将极大地帮助我。谢谢。

看起来您已经在这里对变量列表进行分块了:

对于所有变量列表中的变量列表: 2012年dfs列表。附件下载所有数据变量列表 只需确保每个var_列表只有100项。然后以相同的方式分块csv写入,使用enumerate增加文件名的索引:

对于索引,枚举列表中的out\u列表\u of \u dfs: 将\写入\ csvout\ U列表。重置\ U索引,索引 如果您只是希望在写入时分解最终输出:

对于索引,在enumeratenp.array_Splitx100中列出: 写入到csvout列表,索引
谢谢您的回答,但如果我有200个项目需要下载,那么如何在100个块中输出到excel?@snorlaxxx我添加了另一个代码块,我想这是您在向csv写入时要求的,我们不需要创建命名机制或其他什么吗?您可以在这行中处理:df.to_csv'test'+stride+'.csv'