I am wanting to take a list of various variable names, and assign all of them as instance variables to a class.
Furthermore I would also like to assign attributes to these instance variables from a database.
For Example: I have a dataframe with headers, ('col1', 'col2', 'col3', 'col4'). each row should be a class instance, and each column should be an instance variable of that class. Then the values in each row, should be assigned to each instance variables as attributes for every class instance.
how can i accomplish this?
here is a list of variables:
Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
'SaleCondition', 'SalePrice'],
dtype='object')
Here is an example dataframe:
import pandas as pd
from numpy import nan
d = {'name' : pd.Series(['steve', 'jeff', 'bob'], index=['1', '2', '3']),
....: 'salary' : pd.Series([34, 85, 213], index=['1', '2', '3']), 'male' : pd.Series([1, nan, 0], index=['1', '2', '3']), 'score' : pd.Series([1.46, 0.8, 3.], index=['1', '2', '3'])}
df = pd.DataFrame(d)
This is a natural fit for namedtuples.
#! /usr/bin/env python3
import collections
import pandas as pd
if __name__ == '__main__':
Person = collections.namedtuple('Person', 'male name salary score')
d = {'name': pd.Series(['steve', 'jeff', 'bob'], index=['1', '2', '3']),
'salary': pd.Series([34, 85, 213], index=['1', '2', '3']),
'male': pd.Series([1, float('NaN'), 0], index=['1', '2', '3']),
'score': pd.Series([1.46, 0.8, 3.], index=['1', '2', '3'])}
df = pd.DataFrame(d, columns=sorted(d.keys()))
print(df)
for row in df.values:
print(Person(*row.tolist()))
Output:
male name salary score
1 1.0 steve 34 1.46
2 NaN jeff 85 0.80
3 0.0 bob 213 3.00
Person(male=1.0, name='steve', salary=34, score=1.46)
Person(male=nan, name='jeff', salary=85, score=0.8)
Person(male=0.0, name='bob', salary=213, score=3.0)