2017-03-28 1 views
1

Ich habe einen Pandas-Datenrahmen, der nach der Transponierung 2 Spalten hat. Wenn ich nach Excel exportiere, kommt die erste Spalte mit Formatierung, die nicht von xlsxwriter gesteuert werden kann (alle anderen Spalten können formatiert werden). Wenn ich versuche, eine neue Spalte in den Pandas-Dataframe bei Index 0 einzufügen, kommt sie bei Index 1. Warum ist diese erste Datenrahmenspalte in Pandas nicht änderbar und kann nicht mit xlsxwriter formatiert werden?Pandas können keine Spalte bei Index 0 hinzufügen

Hier ist meine Original-Code:

data_xls = pandas.read_excel(excelPath, "FlowTimes", index_col=None) 

del data_xls['OBJECTID'] #Remove OBJECTID column 
del data_xls['Shape_Length'] #Remove the Shape_Length column 
data_xls.drop(data_xls.columns[0], axis =1) #Remove nameless first column 

decimals = pandas.Series([0,2,0,2,0,2,0,2], index=['Length FT', 'Length MI','Flow Minutes - Mean Annual','Flow Hours - Mean Annual') 
data_xls2 = data_xls.round(decimals) 

data_export = data_xls2.transpose() #Transpose columns to rows 
data_export.reset_index() 
data_export.insert(0,"Temp", None) #THIS IS A TESTING LINE TO SEE WHERE THE COLUMN INSERTS - IT SHOULD INSERT AS THE FIRST COLUMN AT INDEX 0 

print data_export 
os.remove(excelPath) 

writer = pandas.ExcelWriter(excelPath + "x") 
data_export.to_excel(writer, sheet_name = 'FlowTimes', startcol = 0, startrow = 0, header=False) #header = false removes the 0 index in the first row 
workbook = writer.book 
worksheet = writer.sheets['FlowTimes'] 
format1 = workbook.add_format() 
format1.set_align('right') 
format1.set_border(0) 

format2 = workbook.add_format() 
format2.set_bold() 

worksheet.set_column("A:A", 30, format1) 
worksheet.set_column("B:Z", 12, format1) 
worksheet.set_row(0,None, format2) 

writer.save() 

Wenn ich so nicht die data_export.insert Spalte zum Testen enthalten, sieht die Ausgabe:

        0 
Key Strategy Location  Location A 
Length FT       3551 
Length MI       0.67 
Flow Minutes - Mean Annual   35 
Flow Hours - Mean Annual   0.58 

Aber wenn ich schließen die data_export .Insert-Spalte bei Index 0, fügt es nach der ersten Spalte wie folgt ein:

      Temp   0 
Key Strategy Location  None Location A 
Length FT     None  3551 
Length MI     None  0.67 
Flow Minutes - Mean Annual None   35 
Flow Hours - Mean Annual None  0.58 

Wie kann Ich füge entweder eine neue Spalte bei Index 0 ein oder kontrolliere die Formatierung der ersten Spalte beim Exportieren mit xlsxwriter?

Antwort

1

Es stellt sich heraus, dass xlsxwriter den Pandas-Index (Zeilennamen) mit Formatierung importiert, die nicht geändert werden kann. Ich habe das erledigt, indem ich den Index in die erste Spalte kopiert und dann ohne Kopfzeile oder Index nach Excel exportiert habe. Die xlsxwriter-Formatierung für alle Spalten und Zeilen funktioniert jetzt. Hier ist der Arbeitscode:

data_xls = pandas.read_excel(excelPath, "FlowTimes" + gdbNum, index_col=None) 
del data_xls['OBJECTID'] #Remove OBJECTID column 
del data_xls['Shape_Length'] #Remove the Shape_Length column 
data_xls.drop(data_xls.columns[0], axis =1) #Remove nameless first column 

decimals = pandas.Series([0,2,0,2,0,2,0,2], index=['Length FT', 'Length MI','Flow Minutes - Mean Annual','Flow Hours - Mean Annual') 

data_export = data_xls2.transpose() #Transpose columns to rows 
data_export.reset_index() 
data_export.columns = data_export.iloc[0] 
data_export['Key Strategy Location'] = data_export.index #adds index names (row names) as last column 

cols = data_export.columns.tolist() #Create list of columns 
cols.insert(0, cols.pop(-1)) #Move column with index names (row names) to be the first column 
data_export = data_export[cols] 

os.remove(excelPath) 

writer = pandas.ExcelWriter(excelPath + "x") 
data_export.to_excel(writer, sheet_name = 'FlowTimes', startcol = 0, startrow = 0, header=False, index=False) #header = false removes index in the first row, index=false removes first column 
workbook = writer.book 
worksheet = writer.sheets['FlowTimes'] 
format1 = workbook.add_format() 
format1.set_align('right') 
format1.set_border(0) 

format2 = workbook.add_format() 
format2.set_bold() 
format2.set_align('center') 

worksheet.set_column("B:Z", 20, format1) 
worksheet.set_row(0,None, format2) 
worksheet.set_column("A:A", 30, format1) 

writer.save() 
Verwandte Themen