如何合并多个DataFrame的列表以及如何用另一个列表标记每个列

时间:2019-09-04 01:17:53

标签: python pandas dataframe

我有一份来自普查api的DataFrames,我每年都会存储到列表中。

因此,在我的for循环结束时,我有一个包含每年数据帧的列表以及要在for循环旁进行的年列表。

我遇到的问题是合并列表中的所有DataFrame,同时还使用年份列表对其进行标记。

所以我尝试使用reduce函数,但是看起来它只占用了我拥有的6个数据帧中的2个。

concat只需将它们添加到数据框中,而无需标记或更改任何内容

# Dependencies

import pandas as pd
import requests
import json
import pprint

import requests
from census import Census

from us import states

# Census
from config import (api_key, gkey)
year = 2012
c = Census(api_key, year)

for length in range(6):
    c = Census(api_key, year)

    data = c.acs5.get(('NAME', "B25077_001E","B25064_001E",
                          "B15003_022E","B19013_001E"),
                           {'for': 'zip code tabulation area:*'})

    data_df = pd.DataFrame(data)
    data_df = data_df.rename(columns={"NAME": "Name",
                                      "zip code tabulation area": "Zipcode",
                                      "B25077_001E":"Median Home Value",
                                     "B25064_001E":"Median Rent",
                                     "B15003_022E":"Bachelor Degrees",
                                     "B19013_001E":"Median Income"})


    data_df = data_df.astype({'Zipcode':'int64'})   




    filtervalue = data_df['Median Home Value']>0
    filtervalue2 = data_df['Median Rent']>0
    filtervalue3 = data_df['Median Income']>0

    cleandata = data_df[filtervalue][filtervalue2][filtervalue3]
    cleandata = cleandata.dropna()


    yearlst.append(year)
    datalst.append(cleandata)
    year += 1

因此会生成两个单独的列表,一个带有年份,另一个带有数据框。

因此,我的输出要么出现在缺少数据框条目的一个数据框上,要么只是隐瞒了所有内容而没有更改列。

我要寻找的是如何合并列表中的所有内容,但如果可能的话,将datalst [0]标记为yearlst [0]

1 个答案:

答案 0 :(得分:0)

无需年份列表,只需将assign年列到数据框即可。另外,请避免增加 year 并将其用作迭代器列。实际上,请考虑链接您的过程:

for year in range(2012, 2019):
    c = Census(api_key, year) 

    data = c.acs5.get(('NAME', "B25077_001E","B25064_001E", "B15003_022E","B19013_001E"), 
                      {'for': 'zip code tabulation area:*'}) 

    cleandata = (pd.DataFrame(data) 
                   .rename(columns={"NAME": "Name", 
                                    "zip code tabulation area": "Zipcode", 
                                    "B25077_001E": "Median_Home_Value", 
                                    "B25064_001E": "Median_Rent", 
                                    "B15003_022E": "Bachelor_Degrees", 
                                    "B19013_001E": "Median_Income"}) 
                   .astype({'Zipcode':'int64'}) 
                   .query('(Median_Home_Value > 0) & (Median_Rent > 0) & (Median_Income > 0)')
                   .dropna()
                   .assign(year_column = year)
                 )

    datalst.append(cleandata)


final_data = pd.concat(datalst, ignore_index = True)