我想将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
我不需要元组列表或字典列表,但不需要阅读列表。到目前为止,我发现的每个问题似乎都与这两种情况有关。但是我想要自己的类型化对象。
谢谢
答案 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:使Reading
从collections.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,则必须将其初始化。