使用from_dict()初始化pandas DataFrame的子类

时间:2017-03-03 12:53:54

标签: python python-3.x pandas inheritance

我知道使用熊猫时继承是not the simplest alternative,但我很好奇如何获得我想要的结果。

假设我有一个函数,从字符串返回一个字典(字符串可以是路径,集合的名称......):

def str_to_dict(string):
   ...

dic = str_to_dict(s1)
dic
>>> {'col_1' : ['a','b',...], 'col2': [1, 2, ...]

我想要做的是创建一个pandas.DataFrame的子类,它包含dic的数据,同时使用上面的方法通过字符串初始化,并将字符串保留为属性。

我知道简单地将字典传递到pandas.DataFrame会对某些情况有效,但我可能需要更改方向(键是索引而不是列名),所以我想使用{{ 1}}构造函数来获取我的DataFrame。

以下是我的工作:

from_dict

再一次,我知道有继承的替代方案,我可能会继续进行我的项目,但我很好奇如何才能使它工作

1 个答案:

答案 0 :(得分:1)

此处详细阐述了您尝试不起作用的原因:

https://github.com/pandas-dev/pandas/issues/2859

  

这不会起作用,因为它不会返回你的实例   子类。 (这里有一堆问题):

# Works but only if you want the keys of the dictionary to be the columns  
class MySubClass(pandas.DataFrame):
    def __init__(self, string):
         self.my_string_attribute = string
         dic = str_to_dict(string)
         pandas.DataFrame.__init__(dic)

所以你可以做的是为pd.DataFrame类添加这样的功能:

import ast
def str_to_dict(string):
    return ast.literal_eval(string) 

class MySubClass(pd.DataFrame):
    def from_str(self, string):
        df_obj = super().from_dict(str_to_dict(string))
        df_obj.my_string_attribute = string
        return df_obj

data = "{'col_1' : ['a','b'], 'col2': [1, 2]}"

obj = MySubClass().from_str(data)

type(obj)
# __main__.MySubClass

obj.my_string_attribute
# "{'col_1' : ['a','b'], 'col2': [1, 2]}"

enter image description here