【问题标题】:Assign a list to class instances将列表分配给类实例
【发布时间】:2018-03-19 11:35:13
【问题描述】:

我想获取各种变量名的列表,并将它们作为实例变量分配给一个类。

此外,我还想从数据库中为这些实例变量分配属性。

例如:我有一个带有标题的数据框,('col1','col2','col3','col4')。每一行应该是一个类实例,每一列应该是该类的一个实例变量。然后每一行中的值,应该作为每个类实例的属性分配给每个实例变量。

我怎样才能做到这一点?

这里是变量列表:

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

这是一个示例数据框:

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)

【问题讨论】:

  • 这几乎是这个问答的副本:stackoverflow.com/questions/1639174/…
  • 在这篇文章中,“对象”是从数据框自动创建的。而不必单独定义每个对象。例如:>>> class AllMyFields: ... def __init__(self, dictionary): ... for k, v in dictionary.items(): ... setattr(self, k, v) ... >>> o = AllMyFields({'a': 1, 'b': 2}) >>> o.a 1 必须将对象命名为“0”我希望这些对象成为我可以随意调用的索引

标签: python variables object instance-variables


【解决方案1】:

这很适合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()))

输出:

   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)

【讨论】:

    【解决方案2】:

    您可以使用df.to_dict('records') 生成字典列表,

    [{'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}]
    

    然后你可以做这样的事情来创建你的列表,

    class Person(object):    
        def __init__(self, **kwargs):
            self.__dict__.update(kwargs)
    
    people = [Person(**x) for x in df.to_dict('records')]
    

    【讨论】:

    • 当你这样做时,people = [Person(**x) for x in df.to_dict('df')] **x 是什么意思?那是说“所有类实例”。当我运行它时,我收到以下错误。 TypeError: ** 后的类型对象参数必须是映射,而不是 str
    • @ClayChester,应该是 df.to_dict('records'),而不是 df.to_dict('df')。查看DataFrame.to_dict()的文档
    猜你喜欢
    • 2018-07-17
    • 2019-02-23
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多