Python 如何合并多个数据帧的列表并用另一个列表标记每列

Python 如何合并多个数据帧的列表并用另一个列表标记每列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个来自普查api的数据框架lisit,我每年都将其存储在列表中 因此,在for循环的末尾,我有一个列表,其中包含每年的数据帧,以及for循环旁边的年份列表 我遇到的问题是合并列表中的所有数据帧,同时用年份列表标记它们 因此,我尝试使用reduce函数,但它看起来只占用了我拥有的6个数据帧中的2个 concat只是将它们添加到数据帧中,而不进行任何标记或更改 # Dependencies import pandas as pd import requests import json imp

我有一个来自普查api的数据框架lisit,我每年都将其存储在列表中

因此,在for循环的末尾,我有一个列表,其中包含每年的数据帧,以及for循环旁边的年份列表

我遇到的问题是合并列表中的所有数据帧,同时用年份列表标记它们

因此,我尝试使用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)

因此,这将生成两个单独的列表,一个是年份列表,另一个是数据框列表

因此,我的输出要么是一个数据帧缺少数据帧条目,要么只是包含所有数据帧而不更改列


我想知道的是如何在一个列表中合并所有数据,但是如果可能的话,在合并时用yearlst[0]标记datalst[0]

不需要年份列表,只需将年份列添加到数据框即可。另外,避免增加年份,并将其作为迭代器列。事实上,考虑链接你的过程:

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)

接下来的问题是,在对数据帧进行分组后,我是否可以在数据帧上进行Arthermatic。现在看来,我想为每个名字取第一年和最后一年,并计算出%的变化,当然是可行的。请提出一个新问题,包括数据、尝试的代码和期望的结果。
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)