Панды возвращают несколько фреймов данных (или один столбец с новым годом), где имена столбцов одинаковы во всех фреймах данных - PullRequest
0 голосов
/ 03 апреля 2019

Используемые данные: https://factfinder.census.gov/faces/tableservices/jsf/pages/productview.xhtml?pid=ACS_17_5YR_S0101&prodType=table

Цель

  • Комбинированный df для всех лет (2011-2017)
  • Прогноз Общая численность населения для теста почтовый индекс

Я хотел бы сделать комбинированный df на основе столбцов, которые существуют во всех фреймах данных.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random

Как я читаю в каждом файле

# default cleaning method until proven otherwise
def clean_census_frame(csv_path , head=False , reset=True , set_index=False ):
    '''
    inputs) 
        >> csv_path
            > path to csv
        >> head
            > default=False
                >> if != False
                    > integer
                        >> returns the first {head} rows (using .head() method) 
                            > instead of enitre dataframe
        >> reset
            > default=True
                >> resets index after taking out rows
            > if set to False
                >> will not reset index
        >> set_index
            > default=False
            > if != False
                >> will set_index of new df to set_index
    output)
        >> dataframe cleaned like 2000 Census age&sex by 5-digit Zip Code (also how 2010 for same is cleaned)
    how)
        1. reads in csv , assumes it's large
        2. makes a copy for editing 
            > and potential future use
        3. locates readable column names  and non-readable names 
            > readable
                    > e.g. Estimate; SEX AND AGE - Total population
                >> assumes they are currently in row 0
            > non-readable
                    > e.g. HC01_VC03
                >> assumes they are currently == dataframe.columns
        4. replaces dataframe.columns (non-readable) with readable column names
            > and drops the old 0th column (column where readable names were stored)

    '''
    # load data
    df = pd.read_csv( csv_path , low_memory=False )

    # and copy
    _df = df.copy()

    # reset column names to current 0th row values
    _df.columns = _df.iloc[0]
    # new 2000 dataframe without row where values are from
    clean_df = _df[1:]

    # default
    if reset==True:
        # reset index
        clean_df = clean_df.reset_index()

    # set_index
    if set_index:
        clean_df = clean_df.set_index(set_index)

    if head:
        # return first {head} rows of dataframe
        return clean_df.head(head)
    else:
        # return dataframe
        return clean_df

.info () для каждого df после запуска clean_census_frame () Примечание: в порядке 2011-2017

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 328 entries, index to Percent Margin of Error; HISPANIC OR LATINO AND RACE - Total housing units
dtypes: int64(1), object(327)
memory usage: 82.9+ MB
None 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 328 entries, index to Percent Margin of Error; HISPANIC OR LATINO AND RACE - Total housing units
dtypes: int64(1), object(327)
memory usage: 82.9+ MB
None 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 328 entries, index to Percent Margin of Error; HISPANIC OR LATINO AND RACE - Total housing units
dtypes: int64(1), object(327)
memory usage: 82.9+ MB
None 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 328 entries, index to Percent Margin of Error; HISPANIC OR LATINO AND RACE - Total housing units
dtypes: int64(1), object(327)
memory usage: 82.9+ MB
None 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 340 entries, index to Percent Margin of Error; CITIZEN, VOTING AGE POPULATION - Citizen, 18 and over population - Female
dtypes: int64(1), object(339)
memory usage: 85.9+ MB
None 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 340 entries, index to Percent Margin of Error; CITIZEN, VOTING AGE POPULATION - Citizen, 18 and over population - Female
dtypes: int64(1), object(339)
memory usage: 85.9+ MB
None 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33120 entries, 0 to 33119
Columns: 360 entries, index to Percent Margin of Error; CITIZEN, VOTING AGE POPULATION - Citizen, 18 and over population - Female
dtypes: int64(1), object(359)
memory usage: 91.0+ MB
None 

После этого я попытался составить списки столбцов, но столкнулся с проблемой дублирования столбцов в одном и том же кадре данных. За 2011-2012 годы насчитывается 16 дубликатов. За 2013-2017 годы существует 8 дубликатов. Ниже приведена информация о списках столбцов и множеств. Позже я опубликую больше информации о дубликатах.

'''identify columns'''
# 2011
tags11 = y11.columns  
# 2012
tags12 = y12.columns  
#2013
tags13 = y13.columns  
# 2014
tags14 = y14.columns  
# 2015
tags15 = y15.columns  
#2016
tags16 = y16.columns  
# 2017
tags17 = y17.columns 

>>in>> 
# tags is list of each tags above (in order 2011-2017)
for tag in tags:
    print(f'len = {len(tag)}\nunique = {len(set(tag))}')
>>out>> (+ #year)
# 2011
len = 328
unique = 296
# 2012
len = 328
unique = 296
# 2013
len = 328
unique = 320
# 2014
len = 328
unique = 320
# 2015
len = 340
unique = 332
# 2016
len = 340
unique = 332
# 2017
len = 360
unique = 352

Сейчас я возвращаюсь к KMeans на каждом кадре данных, но хотел бы завершить на объединенном кадре данных. Не стесняйтесь сообщения (я новичок здесь). Спасибо!

...