ich ein paar Dateien txt, die alle die gleiche erste Spalte (X
) und die gleichen Spaltennamen (X
, B
, C
), aber die zweite und dritte Spalte sind unterschiedliche Werte.Kombination Dateien in Multiindex Datenrahmen in Python und exportieren schließlich
X | B | C
-----------
a 0 2
b 4 9
...
z 3 0
Ich möchte all diese Tabellen in einen großen Datenrahmen verbinden, aber mit dem Zusatz, dass jeder Teil ist über einen eigenen Index, zum Beispiel basierend auf den Dateinamen. Z.B. wäre [0, 4..., 3]
. Das Endergebnis würde so aussehen.
| f1 | f1 | f2 | f2
X | B | C | B | C
-----------------------
a 0 2 3 2
b 4 9 1 2
...
z 3 0 9 8
Dies ist der Code, den ich bisher habe
import pandas as pd
import numpy as np
import regex as re
dir = 'directory'
path = os.path.abspath(os.path.join(os.getcwd(), dir))
# List all files in folder
filenames = [name for name in os.listdir(path) if re.match(".*\.txt$", name)]
r_coln = re.compile(r"\.txt$")
frames = []
for i in range(len(filenames)):
filename = filenames[i]
coln = r_coln.sub("", filename)
if (i == 0):
# Subtract the first column which is identical for all frames
first_frame = pd.read_csv(os.path.join(path, filename), usecols=[0], sep="\t", names=[''], header=None)
frames.append(first_frame)
# Get frame with a new header
frames.append(pd.read_csv(os.path.join(path, filename), usecols=[1, 2], sep="\t", names=[coln, ''], header=None))
# Combine all frames
df = pd.concat(frames, axis=1)
Dies funktioniert, dass der resultierende Datenrahmen in der Tat wie das Beispiel sieht die ich oben mit Ausnahme geschrieben, dass ich nur eine ‚top‘ habe Überschrift pro Datei. Die Verwendung von names=[coln, coln]
anstelle von names=[coln, '']
führte dazu, dass eine der beiden Spalten gelöscht wurde (und ich weiß nicht warum). Es ist jedoch nicht multi-indiziert. Mit anderen Worten, ich kann nicht auf df['f1']['B']
zugreifen, weil es den Fehler KeyError: 'B'
zurückgibt. Ich suche nach einer Möglichkeit, dies zu ermöglichen. Entweder durch Umwandlung der resultierenden df
nach der Einleseschleife oder durch Ändern von etwas innerhalb der Schleife.
Schließlich möchte ich auch diesen Datenrahmen in eine Tab-getrennte Textdatei exportieren.
Sie können das Argument 'keys' in' pd.concat' verwenden. Es erstellt automatisch einen Multi-Index und fügt eine höhere Ebene hinzu, die aus bestandenen Schlüsseln besteht. ('names' fügt Namen für die Ebenen hinzu.) Wahrscheinlich wollen Sie auch zuerst' X' als Index setzen - entweder mit der '.set_index' Methode oder mit dem' index_col' Argument zu 'pd.read_csv'. – ptrj