熊猫,如何重置? -传递的值的形状为(1,1),索引表示(3,1)

时间:2019-02-01 11:11:38

标签: arrays python-3.x pandas

我目前正在编写一些代码,并正在使用pandas将所有数据导出到csv文件中。我的程序运行多次迭代,直到遍历所有必需的文件为止。熊猫每次迭代都在重写一个文件,但是当它移到下一个文件时,我需要它来重置所有数据(我认为)。

结构大致为:

循环时,有几个变量被命名>程序运行> dataframe=(pandas.DataFrame(averagepercentagelist,index=namelist,columns=header))

这部分对一个文件没有问题。当移到下一个文件时,我使用的所有数组都将重置,这就是为什么熊猫给出错误Shape of passed values is (1,1), indices imply (3,1)的原因。

如果需要进一步说明,请告诉我。

编辑:

While True:
    try:
        averagepercentagelist=[]
        namelist=[]
        columns=[]
        for row in database:
            averagepercentagelist=["12","23"]
            namelist=["Name0","Name1"]
            columns=["Average percentage"]
            dataframe=(pandas.DataFrame(averagepercentagelist,index=namelist,columns=header))
    except Exception as e:
        print e
        break

片段:

dataframe= (pandas.DataFrame(averagepercentagelist,index=namelist,columns=header))

currentcalculatedatafrane = 'averages' + currentcalculate

dataframeexportpath = os.path.join(ROOT_PATH,'Averages',currentcalculatedatafrane)

dataframe.to_csv(dataframeexportpath)

整个计划如此之遥:

import csv
import os
import re
import pandas
import tkinter as tk
from tkinter import messagebox
from os.path import isfile, join
from os import listdir
import time



ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
indexforcalcu=0
line_count=0
testlist=[]
namelist=[]
header=['Average Percentage']



def clearvariables():
    indexforcalcu=0
    testlist=[]

def findaverageofstudent(findaveragenumber,numoftests):
    total=0
    findaveragenumber = findaveragenumber/numoftests
    findaveragenumber = round(findaveragenumber, 1)
    return findaveragenumber





def removecharacters(nameforfunc):
    nameforfunc=str(nameforfunc)
    elem=re.sub("[{'}]", "",nameforfunc)
    return elem





def getallclasses():
    onlyfiles = [f for f in listdir(ROOT_PATH) if isfile(join(ROOT_PATH, f))]
    onlyfiles.remove("averagecalculatorv2.py")
    return onlyfiles





def findaveragefunc():
    indexforcalcu=-1
    while True:
        try:
            totaltests=0
            line_count=0
            averagepercentagelist=[]
            indexforcalcu=indexforcalcu+1
            allclasses=getallclasses()
            currentcalculate=allclasses[indexforcalcu]
            classpath = os.path.join(ROOT_PATH, currentcalculate)
            with open(classpath) as csv_file:
                classscoredb = csv.reader(csv_file, delimiter=',')
                for i, row in enumerate(classscoredb):
                    if line_count == 0:
                        while True:
                            try:
                                totaltests=totaltests+1
                                rowreader= {row[totaltests]}
                            except:
                                totaltests=totaltests-1
                                line_count = line_count + 1
                                break
                    else:
                        calculating_column_location=1
                        total=0

                        while True:
                            try:
                                total = total + int(row[calculating_column_location])
                                calculating_column_location = calculating_column_location + 1
                            except:
                                break

                        i=str(i)
                        name=row[0]
                        cleanname=removecharacters(nameforfunc=name)
                        namelist.append(cleanname)
                        findaveragenumbercal=findaverageofstudent(findaveragenumber=total,numoftests=totaltests)
                        averagepercentagelist.append(findaveragenumbercal)
                        line_count = line_count + 1
                        dataframe= (pandas.DataFrame(averagepercentagelist,index=namelist,columns=header))
                        currentcalculatedatafrane = 'averages' + i + currentcalculate
                        dataframeexportpath = os.path.join(ROOT_PATH,'Averages',currentcalculatedatafrane)
                        dataframe.to_csv(dataframeexportpath)
                        i=int(i)


        except Exception as e:
            print("ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n",e)
            break





def makenewclass():
    global newclassname
    getclassname=str(newclassname.get())

    if getclassname == "":
        messagebox.showerror("Error","The class name you have entered is invalid.")
    else:
        classname = getclassname + ".csv"
        with open(classname, mode='w') as employee_file:
            classwriter = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
            classwriter.writerow(["Name","Test 1"])











root=tk.Tk()




root.title("Test result average finder")


findaveragebutton=tk.Button(root,text="Find Averages",command=findaveragefunc())
findaveragebutton.grid(row=2,column=2,padx=(10, 10),pady=(0,10))


classnamelabel=tk.Label(root, text="Class name:")
classnamelabel.grid(row=1, column=0,padx=(10,0),pady=(10,10))


newclassname = tk.Entry(root)
newclassname.grid(row=1,column=1,padx=(10, 10))


newclassbutton=tk.Button(root,text="Create new class",command=makenewclass)
newclassbutton.grid(row=1,column=2,padx=(0, 10),pady=(10,10))



root.mainloop()

预先感谢, 肖恩

1 个答案:

答案 0 :(得分:0)

使用:

import glob, os
import pandas as pd


ROOT_PATH = os.path.dirname(os.path.abspath(__file__))

#extract all csv files to list    
files = glob.glob(f'{ROOT_PATH}/*.csv')
print (files)

#create new folder if necessary
new = os.path.join(ROOT_PATH,'Averages')
if not os.path.exists(new):
    os.makedirs(new)

#loop each file
for f in files:
    #create DataFrame and convert first column to index
    df = pd.read_csv(f, index_col=[0])
    #count average in each row, rond and create one colum DataFrame
    avg = df.mean(axis=1).round(1).to_frame('Average Percentage')
    #remove index name if nncessary
    avg.index.name = None
    print (avg)

    #create new path
    head, tail = os.path.split(f)
    path = os.path.join(head, 'Averages', tail)
    print (path)  

    #write DataFrame to csv
    avg.to_csv(path)