Ist es möglich, einem Pandas DataFrame einige Metainformationen / Metadaten hinzuzufügen?
Zum Beispiel der Name des Instruments, mit dem die Daten gemessen werden, das verantwortliche Instrument usw.
Eine Problemumgehung wäre, eine Spalte mit diesen Informationen zu erstellen, aber es erscheint verschwenderisch, in jeder Zeile eine einzelne Information zu speichern!
Antworten:
Sicher, wie bei den meisten Python-Objekten können Sie neue Attribute an Folgendes anhängen
pandas.DataFrame
:Beachten Sie jedoch, dass , während Sie Attribute zu einem Datenrahmen anbringen können, durchgeführten Operationen auf dem Datenrahmen (wie
groupby
,pivot
,join
oder umloc
nur einige zu nennen) einen neuen Datenrahmen zurückkehren können , ohne angebracht Metadaten. Pandas verfügt noch nicht über eine robuste Methode zur Weitergabe von an DataFrames angehängten Metadaten .Das Beibehalten der Metadaten in einer Datei ist möglich. Ein Beispiel zum Speichern von Metadaten in einer HDF5-Datei finden Sie hier .
quelle
store = pd.HDFStore(...)
, dann können Attribute mit gespeichert werdenstore.root._v_attrs.key = value
.df = pd.DataFrame(); df.meta = {}
erzeugtUserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
). (Es wird keine Warnung ausgegeben, wenn das Attribut bereits wie in erstellt wurde.df = pd.DataFrame(); df.meta = ''; df.meta = {}
)Nicht wirklich. Obwohl Sie der DataFrame-Klasse Attribute hinzufügen können, die Metadaten enthalten, wie @unutbu erwähnt, geben viele DataFrame-Methoden einen neuen DataFrame zurück, sodass Ihre Metadaten verloren gehen. Wenn Sie Ihren Datenrahmen bearbeiten müssen, ist es am besten, Ihre Metadaten und Ihren Datenrahmen in eine andere Klasse einzubinden. Siehe diese Diskussion auf GitHub: https://github.com/pydata/pandas/issues/2485
Derzeit gibt es eine offene Pull-Anforderung zum Hinzufügen eines MetaDataFrame-Objekts, das Metadaten besser unterstützen würde.
quelle
Ich bin gerade auf dieses Problem gestoßen. Ab Pandas 0.13 verfügen DataFrames über ein _metadata-Attribut, das über Funktionen erhalten bleibt, die neue DataFrames zurückgeben. Scheint auch die Serialisierung gut zu überleben (ich habe nur json ausprobiert, aber ich stelle mir vor, dass auch hdf abgedeckt ist).
quelle
_metadata
ist nicht Teil der öffentlichen API, daher würde ich dringend empfehlen, sich nicht auf diese Funktionalität zu verlassen..attrs
Teil der Röntgen-API)_metadata
ist eigentlich ein Klassenattribut, kein Instanzattribut. SoDataFrame
erben neue Instanzen von vorherigen, solange das Modul geladen bleibt. Nicht_metadata
für irgendetwas verwenden. +1 fürxarray
!Ab Pandas 1.0, möglicherweise früher, gibt es jetzt eine
Dataframe.attrs
Eigenschaft. Es ist experimentell, aber das ist wahrscheinlich das, was Sie in Zukunft wollen werden.Finden Sie es in den Dokumenten hier .
Wenn Sie dies mit
to_parquet
und dannfrom_parquet
ausprobieren, scheint es nicht zu bestehen. Überprüfen Sie dies daher anhand Ihres Anwendungsfalls.quelle
Die beste Antwort beim Anhängen beliebiger Attribute an das DataFrame-Objekt ist gut. Wenn Sie jedoch ein Wörterbuch, eine Liste oder ein Tupel verwenden, wird der Fehler "Pandas erlaubt nicht, dass Spalten über einen neuen Attributnamen erstellt werden" ausgegeben. Die folgende Lösung dient zum Speichern beliebiger Attribute.
quelle
pd.DataFrame._metadata += ["meta"]
. Beachten Sie, dass dieser Teil ein Attribut von Pandas ist, kein Attribut Ihres spezifischen Datenrahmensdf.meta
eine Warnung ausgelöst wird, dass Pandas auf diese Weise keine neuen Spalten generieren kann.df.meta
es sich um einen SimpleNamespace handelt. Pandas werden nicht versuchen, eine Spalte daraus zu erstellen.Wie in anderen Antworten und Kommentaren erwähnt,
_metadata
ist es kein Teil der öffentlichen API, daher ist es definitiv keine gute Idee, es in einer Produktionsumgebung zu verwenden. Möglicherweise möchten Sie es dennoch in einem Forschungsprototyp verwenden und ersetzen, wenn es nicht mehr funktioniert. Und im Moment funktioniert es mitgroupby
/apply
, was hilfreich ist. Dies ist ein Beispiel (das ich in anderen Antworten nicht finden konnte):Ausgabe:
quelle
Als ich ziemlich spät dazu kam, dachte ich, dass dies hilfreich sein könnte, wenn Sie Metadaten benötigen, um über E / A zu bestehen. Es gibt ein relativ neues Paket namens h5io , mit dem ich dies erreicht habe.
Sie sollten damit ein schnelles Lesen / Schreiben von HDF5 für einige gängige Formate durchführen können, von denen eines ein Datenrahmen ist. So können Sie beispielsweise einen Datenrahmen in ein Wörterbuch einfügen und Metadaten als Felder in das Wörterbuch aufnehmen. Z.B:
Eine andere Möglichkeit wäre, ein Projekt wie xray zu untersuchen , das in gewisser Weise komplexer ist, aber ich denke, Sie können damit Metadaten verwenden und es ist ziemlich einfach, es in einen DataFrame zu konvertieren.
quelle
Wie von @choldgraf erwähnt, hat sich xarray als hervorragendes Werkzeug zum Anhängen von Metadaten beim Vergleichen von Daten und Plotten von Ergebnissen zwischen mehreren Datenrahmen herausgestellt.
In meiner Arbeit vergleichen wir häufig die Ergebnisse mehrerer Firmware-Revisionen und verschiedener Testszenarien. Das Hinzufügen dieser Informationen ist so einfach:
quelle
Ich habe nach einer Lösung gesucht und festgestellt, dass Pandas Frame die Eigenschaft hat
attrs
Dieses Attribut bleibt immer bei Ihrem Rahmen, wenn Sie es passieren!
quelle
Ich hatte das gleiche Problem und verwendete eine Problemumgehung zum Erstellen eines neuen, kleineren DF aus einem Wörterbuch mit den Metadaten:
Dieses dfMeta kann dann zusammen mit Ihrem ursprünglichen DF in pickle usw. Gespeichert werden
Siehe Speichern und Laden mehrerer Objekte in einer Pickle-Datei? (Lutz 'Antwort) für eine hervorragende Antwort zum Speichern und Abrufen mehrerer Datenrahmen mit pickle
quelle
Das Hinzufügen zu @ryanjdillon beantwortet diesen hilfreichen Stackoverflow-Thread und zeigt, wie Parkettdateien benutzerdefinierte Metadaten hinzugefügt werden. Anpassung dieser Antwort an eine Funktion:
Auf diese Metadaten kann jetzt zugegriffen werden über:
quelle