在if循环中创建多个数据帧作为类实例的属性

问题描述 投票:0回答:2

我有一个类myClass,我希望也添加几个数据帧。首先,该类需要一个名称,以及要创建的实例的文件路径列表:

class myClass:
    def __init__(self, name, filepathlist):
        self.name = name
        self.filepathlist = filepathlist

拉入实例的数据不是所需的格式。因此,我创建了一个类的方法来格式化数据,并为每个读取的文件创建类的属性:

def formatData(self):

    i = 0
    if i < (len(self.filepathlist) - 1):
        DFRAW = pd.read_csv(self.filepathlist[i], header = 9) #Row 9 is the row that is not blank (all blank auto-skipped)
        DFRAW['DateTime'], DFRAW['dummycol1'] = DFRAW['    ;W;W;W;W'].str.split(';', 1).str
        DFRAW['Col1'], DFRAW['dummycol2'] = DFRAW['dummycol1'].str.split(';', 1).str
        DFRAW['Col2'], DFRAW['dummycol3'] = DFRAW['dummycol2'].str.split(';', 1).str
        DFRAW['Col3'], DFRAW['Col4'] = DFRAW['dummycol3'].str.split(';', 1).str
        DFRAW= DFRAW.drop(['    ;W;W;W;W', 'dummycol1', 'dummycol2', 'dummycol3'], axis = 1)

        #There appears to be an issue with these two lines.
        processedfilename = "MYDFNAME" + str(i)
        self.processedfilename = DFRAW
        i = i + 1

我已经运行了代码的格式化行,那些以DRAW开头的类,在类之外,并且相信它们正常工作。

在脚本的某处,将数据帧指定为类的属性存在问题;我创建了一个文件路径列表和一个类的实例:

filepathlist = [r"file1.csv",r"file2.csv"]
myINST = myClass("MyInstName", filepathlist )

然后运行格式化方法:

myINST.formatData()

现在运行以下命令检查类的实例myINST是否正确分配了属性;

vars(myINST)

但是这会返回文件路径列表,名称以及来自数据帧的大约8000行数据行。我期待以下内容:

filepathlist,name,MYDFNAME0,MYDFNAME1

我的代码或方法中的错误是什么?

python object dataframe
2个回答
1
投票

vars将返回一个实例的所有值,因为myClass有三个值:namefilepathlistprocessedfilename(它应该是一个数据帧),所以它将返回所有值。

如果您只需要文件路径列表,则可以通过instance_object.field_name访问它。

myINST.filepathlist,这将返回[r"file1.csv",r"file2.csv"]

此外,你可能在这里做得不正确:

processedfilename = "MYDFNAME" + str(i)
self.processedfilename = DFRAW
i = i + 1

(1)您将数据框对象存储在名为processedfilename的字段中,这很奇怪。 (2)你没有附加值而是替换,因此在循环之后,这将只返回filepathlist中的最新数据框。

您应该以更好的格式存储数据框:列表,字典等。


0
投票

实际上,如果将其合并到vars()方法中,您可以访问__init__中的数据框。下面构建一个数据帧字典,其中键是原始csv文件名。

class myClass:
    def __init__(self, name, filepathlist):
        self.name = name
        self.filepathlist = filepathlist
        self.mydataframedict = self.formatData()

    def formatData(self):
        tmp_dict = {}

        for f in self.filepathlist:            
            DFRAW = pd.read_csv(f, header = 9)

            DFRAW['DateTime'], DFRAW['dummycol1'] = DFRAW['    ;W;W;W;W'].str.split(';', 1).str
            DFRAW['Col1'], DFRAW['dummycol2'] = DFRAW['dummycol1'].str.split(';', 1).str
            DFRAW['Col2'], DFRAW['dummycol3'] = DFRAW['dummycol2'].str.split(';', 1).str
            DFRAW['Col3'], DFRAW['Col4'] = DFRAW['dummycol3'].str.split(';', 1).str
            DFRAW = DFRAW.drop(['    ;W;W;W;W', 'dummycol1', 'dummycol2', 'dummycol3'], axis = 1)

            tmp_dict[f] = DFRAW

        return tmp_dict


filepathlist = [r"file1.csv", r"file2.csv"]
myINST = myClass("MyInstName", filepathlist )   

new_dict = myINST.formatData()                # LOCAL VARIABLE (ALSO ACCESSIBLE IN VARS)

print(vars(myINST))

# {'name': 'MyInstName', 'mydataframedict': {'file1.csv': ..., 'file2.csv': ...}, 
# 'filepathlist': ['file1.csv', 'file2.csv']}
© www.soinside.com 2019 - 2024. All rights reserved.