【问题标题】:How to Merge a list of Multiple DataFrames and Tag each Column with a another list如何合并多个 DataFrame 的列表并用另一个列表标记每个列
【发布时间】:2019-09-04 01:17:53
【问题描述】:

我有一个来自人口普查 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

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

所以我的输出要么是一个缺少 Dataframe 条目的 Dataframe,要么只是连接所有而不更改列。

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    不需要年份列表,只需 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)
    

    【讨论】:

    • 后续问题是我可以在分组后对数据框进行算术运算吗?目前看起来像这样gyazo.com/77ff9a29aafe1cce09e1d7e38fedb917 就像我想为每个名称取第一年和去年的变化并计算百分比的变化
    • 当然可行。请通过minimal reproducible example 提出一个新问题,包括数据、尝试的代码和期望的结果。
    猜你喜欢
    • 2016-01-17
    • 2021-06-02
    • 2020-07-19
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多