2017-10-08 1 views
2

Ich möchte eine Liste verschiedener Variablennamen aufnehmen und sie alle als Instanzvariablen einer Klasse zuweisen.Weisen Sie den Klasseninstanzen eine Liste zu

Des Weiteren möchte ich diesen Instanzvariablen auch Attribute aus einer Datenbank zuweisen.

Zum Beispiel: Ich habe ein Datenframe mit Kopfzeilen, ('col1', 'col2', 'col3', 'col4'). Jede Zeile sollte eine Klasseninstanz sein, und jede Spalte sollte eine Instanzvariable dieser Klasse sein. Dann sollten die Werte in jeder Zeile jeder Instanzvariablen als Attribute für jede Klasseninstanz zugewiesen werden.

Wie kann ich das erreichen?

hier ist eine Liste von Variablen:

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') 

Hier ist ein Beispiel Datenrahmen:

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) 
+0

Ist das ziemlich viel ein Duplikat dieser Frage-Antwort: https://stackoverflow.com/questions/1639174/creating-class-instance-properties-from-a-dictionary – Bill

+1

Mögliche Duplikate von [Erstellen von Klasseninstanz-Eigenschaften aus einem Wörterbuch?] (https: //stackoverflow.com/questions/1639174/creating-class-instance-properties-from-a-dictionary) – toonarmycaptain

+0

In diesem Post werden die "Objekte" automatisch aus dem Datenrahmen erstellt. anstatt jedes Objekt einzeln definieren zu müssen. zum Beispiel: '>>> Klasse AllMyFields: ... def __init __ (selbst, Wörterbuch): ... für k, v in dictionary.items(): ... setattr (selbst, k, v) ... >>> o = AllMyFields ({'a': 1, 'b': 2}) >>> oa 1' muss das Objekt als "0" bezeichnen Ich möchte, dass diese Objekte der Index sind dass ich nach Belieben –

Antwort

1

Dies ist eine natürliche Ergänzung für namedtuple s.

#! /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())) 

Ausgang:

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) 
1

Sie können df.to_dict('records') verwenden, um eine Liste der Wörterbücher zu erzeugen,

[{'male': 1.0, 'name': 'steve', 'salary': 34, 'score': 1.46}, 
{'male': nan, 'name': 'jeff', 'salary': 85, 'score': 0.8}, 
{'male': 0.0, 'name': 'bob', 'salary': 213, 'score': 3.0}] 

Dann können Sie etwas tun, Ihre Liste zu erstellen,

class Person(object):  
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

people = [Person(**x) for x in df.to_dict('records')] 
+0

aufrufen kann, wenn du es tust, 'people = [Person (** x) für x in df.to_dict ('df')]' was bedeutet ** x? heißt das "alle Klasseninstanzen". Wenn ich das ausführe, erhalte ich den folgenden Fehler. TypeError: Typ Objekt Argument nach ** muss ein Mapping sein, nicht str –

+0

@ClayChester, sollte 'df.to_dict ('records')', nicht 'df.to_dict ('df')' sein. Sehen Sie sich die Dokumentation zu [DataFrame.to_dict()] an (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_dict.html) – Aldehir

Verwandte Themen