将Pandas DataFrame转换为对象列表

时间:2018-11-07 15:29:58

标签: python pandas dataframe

我想将Pandas DataFrame转换为对象列表。

这是我的课程:

class Reading:

    def __init__(self):
        self.HourOfDay: int = 0
        self.Percentage: float = 0

我阅读了.to_dict,所以尝试了

df.to_dict(into=Reading)

但它返回了

TypeError: unsupported type

我不需要元组列表或字典列表,但不需要阅读列表。到目前为止,我发现的每个问题似乎都与这两种情况有关。但是我想要自己的类型化对象。

谢谢

3 个答案:

答案 0 :(得分:1)

具有带有两列HourOfDay和Percentage的数据框,以及类的参数化构造函数,您可以定义如下所示的Object列表:

 class Reading:

   def __init__(self, h, p):
       self.HourOfDay = h 
       self.Percentage = p 

 listOfReading= [(Reading(row.HourOfDay,row.Percentage)) for index, row in df.iterrows() ]  

答案 1 :(得分:1)

使用参数初始化类可能会更好,如下所示:

 class Reading:
   def __init__(self, h, p):
       self.HourOfDay = h 
       self.Percentage = p 

然后,要创建阅读列表,您可以使用此函数,该函数将 DataFrame 作为参数:

 def reading_list(df:pd.DataFrame)->list:
    return list(map(lambda x:Reading(h=x[0],p=x[1]),df.values.tolist()))

执行速度很快,即使数据集很大。

答案 2 :(得分:0)

选项1:使Readingcollections.MutableMapping继承并实现该基类的necessary methods。似乎需要做很多工作。

选项2:在列表理解中致电Reading()

>>> import pandas as pd
>>> 
>>> df = pd.DataFrame({
...     'HourOfDay': [5, 10],
...     'Percentage': [0.25, 0.40]
... })
>>> 
>>> class Reading(object):
...     def __init__(self, HourOfDay: int = 0, Percentage: float = 0):
...         self.HourOfDay = int(HourOfDay)
...         self.Percentage = Percentage
...     def __repr__(self):
...         return f'{self.__class__.__name__}> (hour {self.HourOfDay}, pct. {self.Percentage})'
... 
>>> 
>>> readings = [Reading(**kwargs) for kwargs in df.to_dict(orient='records')]
>>> 
>>> 
>>> readings
[Reading> (hour 5, pct. 0.25), Reading> (hour 10, pct. 0.4)]

来自文档:

  

into:用于返回值中所有Mapping的collections.Mapping子类。可以是实际的类或所需的映射类型的空实例。如果需要collections.defaultdict,则必须将其初始化。