Gibt es einen einfachen Weg, um einen Pandas Datenrahmen aus einem benannten Bereich in Excel zu bekommen. Die Funktion read_excel dient zum Lesen ganzer Blätter in einer Arbeitsmappe.Pandas Datenrahmen von Excel benannten Bereich
Antwort
Sie können dies über Art und Weise in einer Runde machen read_excel verwenden, es bietet:
skiprows : list-like
Rows to skip at the beginning (0-indexed)
skip_footer : int, default 0
Rows at the end to skip (0-indexed)
parse_cols : int or list, default None
If None then parse all columns,
If int then indicates last column to be parsed
If list of ints then indicates list of column numbers to be parsed
If string then indicates comma separated list of column names and column ranges (e.g. “A:E” or “A,C,E:F”)
Das bedeutet, wenn Sie die Spaltennamen und die Zeilennummern wissen (? Vermutlich, was Sie unter „benannten Bereich“) Sie können nur diesen Abschnitt auswählen, um den DataFrame zu erstellen.
zitieren die Microsoft Office help pages:
A [benannten Bereich] ist eine sinnvolle Kurzschrift, die es einfacher zu verstehen, den Zweck einer Zelle bezieht, konstant, eine Formel oder Tabelle, von denen jeder sein kann, schwer auf dem ersten Blick zu verstehen.“
Benannte Bereiche in Tabellen zu einfachen Zugriff auf Daten über ODBC außerdem werden häufig verwendet und sind besonders nützlich, wenn es mehr Daten im selben Arbeitsblatt reichen. über ODBC Excel zu verbinden, Wählen Sie einfach die entsprechende Excel driver und eine SQL-Anweisung wie z.B .:
SELECT *
FROM namedRange
Der nützliche Befehl in Pandas wahrscheinlich read_sql würde senden.
In Windows Diese Lösung erfordert jedoch, dass Sie die installierten Software-Versionen (32-Bit oder 64-Bit) von Excel, die ODBC-Treiber und das Software-Paket, von dem Sie die ODBC-Verbindung öffnen ausrichten/rationalisieren. Als Beispiel benötigt eine installierte Excel 32-Bit-Version einen 32-Bit-ODBC-Treiber und normalerweise eine 32-Bit-Installation von Python. Hinweis: Dieser letzte Punkt muss noch für den Python-Fall bestätigt werden (ich bin ein Anfänger für Python), aber ich kann diesen Punkt für ODBC-Verbindungen, die von SAS, SPSS oder Stata gestartet werden, definitiv bestätigen.
Die vorherige Anforderung ist ein sehr signifikanter Nachteil und spricht tatsächlich für jede Lösung, die ODBC überhaupt nicht involviert. Allerdings wäre es schön, wenn read_Excel eine solche Einrichtung zur Verfügung stellen würde. In diesem Zusammenhang ist es interessant zu bemerken, dass SAS, SPSS und Stata derzeit keinen direkten Zugriff auf benannte Bereiche in ihren jeweiligen Excel-Filtern erlauben - also vielleicht gibt es einen objektiven Grund für dieses fehlende Merkmal ...
Sie können dazu das zugrunde liegende xlrd
-Paket verwenden.
Das Paket xlrd
enthält ein Verzeichnis examples
, das xlrdnameAPIdemo.py
enthält, wie in here dokumentiert.
In aller Kürze für den benannten Bereich print_area
Versuch:
book = xlrd.open_workbook('examples/namesdemo.xls')
name_obj = book.name_map['print_area'][0]
print name_obj.__dict__
Sie werden name_obj
sehen einen Eintrag:
'result': Operand(kind=oREF, value=[Ref3D(coords=(2, 3, 0, 4, 0, 14))], text=u'Sheet3!$A$1:$N$4')
, die Sie das Beispiel zu interpretieren folgen kann, wenn es doesn t einfach aussehen - z. Der Bereich kann relativ sein oder nicht, abhängig vom Wert result.kind
.
Weiter, als ich versuchte, dies zu verwenden, um meine eigene Tabelle zu lesen (erstellt auf einem Mac), fand ich result
war None
; stattdessen die einzige ref auf den Bereich in name_obj
war:
'formula_text': u'Sheet1!$B$6:$E$11'
So kann es eine Möglichkeit, diese Arbeit in einem allgemeinen Fall zu machen, aber es sieht aus wie es einige Versuch und Irrtum nehmen würde.
Wenn Sie Ihre Tabelle so formatieren können, dass Ihre Tabelle anstelle von benannten Bereichen in den Zeilen unmittelbar nach einer eindeutigen Überschrift (key
) folgt und mit einer leeren Zeile endet, finden Sie hier eine Funktion, die die Tabelle findet
def table_position(path, sheet_name, key):
"""
Find the start and end rows of a table in an Excel spreadsheet
based on the first occurence of key text on the sheet, and down
to the first blank line.
Returns (col, start_row, end_row, skip_footer)
where:
col is the column number containing the key text,
start_row is the row after this,
end_row is the row number of the next blank line,
skip_footer is how many rows from the end of the sheet this is.
You can then read in the table with:
x = pd.read_excel(path, sheet_name, skiprows=start, skip_footer=skip_footer, header=0)
x = x.dropna(axis=1, how='all')
"""
import xlrd
book = xlrd.open_workbook(path)
sheet = book.sheet_by_name(sheet_name)
# find the first occurrence of the key, and the next line break
(col, start, end) = (-1, -1, sheet.nrows)
for rownum in xrange(sheet.nrows):
if col<0: # look for key to start the table off
try:
test_col = next(c for c in xrange(sheet.ncols) if sheet.cell(rownum, c).value==key)
except StopIteration:
pass
else:
col, start = test_col, rownum+1 # row after key text is the start
else: # test for blank line as end of table
if not [True for cell in sheet.row(rownum) if cell.value]:
end = rownum
break
skip_footer = sheet.nrows - end
return (col, start, end, skip_footer)
Wenn Sie diese folgen mit einem pd.read_excel
dann zweimal die Datendatei, die Sie lesen, was dumm ist, aber Sie bekommen die Idee: richtigen Parameter zu pd.read_excel
zu senden.
Vielleicht werden irgendwann Pandas dies nativ unterstützen. Bis dahin verwende ich eine Hilfsfunktion:
import pandas as pd
import openpyxl
def data_frame_from_xlsx(xlsx_file, range_name):
""" Get a single rectangular region from the specified file.
range_name can be a standard Excel reference ('Sheet1!A2:B7') or
refer to a named region ('my_cells')."""
wb = openpyxl.load_workbook(xlsx_file, data_only=True, read_only=True)
if '!' in range_name:
# passed a worksheet!cell reference
ws_name, reg = range_name.split('!')
if ws_name.startswith("'") and ws_name.endswith("'"):
# optionally strip single quotes around sheet name
ws_name = ws_name[1:-1]
region = wb[ws_name][reg]
else:
# passed a named range; find the cells in the workbook
full_range = wb.get_named_range(range_name)
if full_range is None:
raise ValueError(
'Range "{}" not found in workbook "{}".'.format(range_name, xlsx_file)
)
# convert to list (openpyxl 2.3 returns a list but 2.4+ returns a generator)
destinations = list(full_range.destinations)
if len(destinations) > 1:
raise ValueError(
'Range "{}" in workbook "{}" contains more than one region.'
.format(range_name, xlsx_file)
)
ws, reg = destinations[0]
# convert to worksheet object (openpyxl 2.3 returns a worksheet object
# but 2.4+ returns the name of a worksheet)
if isinstance(ws, str):
ws = wb[ws]
region = ws[reg]
df = pd.DataFrame([cell.value for cell in row] for row in region)
return df
Hier ist die Art, wie ich openpyxl verwenden, um einen Bereich in einem [[]] kopieren:
wb = load_workbook(filename=xlPath)
ws, range= next(wb.defined_names["rangename"].destinations)
materials = [[cell.value for cell in row] for row in wb[ws][range]]
- 1. pandas: to_csv mit einem numerischen Bereich von benannten Spalten?
- 2. Zähldaten in einem Bereich von Pandas Datenrahmen
- 3. Ausschließen Tag von Bereich Pandas Datenrahmen Datum
- 4. Zusammenführen von zwei Pandas-Datenrahmen in mehreren unterschiedlich benannten Spalten
- 5. Von kennwortgeschützte Excel-Datei Datenrahmen Pandas
- 6. Serienwerte in benannten Bereich ändern
- 7. Einen benannten Excel-Bereich in ein Array (VBA) lesen
- 8. Kann nicht mit SSIS in einen benannten Excel-Bereich exportieren
- 9. Excel 2010 VBA Transfer mehrspaltig Listbox zu benannten Bereich
- 10. Pandas: Zusammenführen von Datenrahmen
- 11. Median von Pandas Datenrahmen
- 12. Pandas Datenrahmen von komplexen Zahlen zu Excel exportieren
- 13. Kombiniere eine Liste von Pandas Datenrahmen zu einem Pandas Datenrahmen
- 14. Excel Name Bereich ändern Ereignis
- 15. Plot Balkendiagramm von Pandas Datenrahmen
- 16. Hinzufügen von zwei Pandas Datenrahmen
- 17. dict von dict Pandas Datenrahmen
- 18. Spalten von Pandas Datenrahmen normalisieren
- 19. Sortieren Pandas Datenrahmen von Datum
- 20. Maximale Größe von Pandas Datenrahmen
- 21. Seaborn Zeitreihe von Pandas Datenrahmen
- 22. Verschachteltes Wörterbuch von Pandas Datenrahmen
- 23. Sortieren Pandas Datenrahmen von Wert
- 24. Entfernen Klammern von Pandas Datenrahmen
- 25. Wie erstellt man ein Wörterbuch von Pandas-Datenrahmen und gibt die Datenrahmen in Excel-Arbeitsblätter zurück?
- 26. Python: schnellste Weg Pandas Datenrahmen zu Excel auf mehrere Blätter
- 27. Einen benannten Bereich in ein VBA-Bereich-Objekt transponieren
- 28. Anfügen vorhandener Excel-Tabelle mit neuen Datenrahmen mit Python Pandas
- 29. Pandas Multiindex Datenrahmen sortieren
- 30. Pandas Datenrahmen extrahieren Strings
Auf diese Weise können Sie Zeilen am Anfang überspringen. Es wird immer noch bis zur letzten leeren Zelle im Blatt gelesen. –
Schauen Sie sich DataNitro an. Es ist eine ziemlich tolle Ergänzung für Excel, die genau diese Art von Sache sowie viele andere ermöglicht. Es ist kostenlos für nicht-kommerzielle Projekte. Ich benutze es ausgiebig –
@DavidNehme ist das nicht der Punkt von skip_footer? (Ich stimme zu, das könnte mit einer netten Wrapper-Funktion tun ..) –