Untertitel: Dumb it down Pandas, hör auf, clever zu sein.Concat Liste der Pandas Datenrahmen, aber ignorieren Spalte Name
Ich habe eine Liste (res
) von Single-Column Pandas Datenrahmen, jeder enthält die gleiche Art von numerischen Daten, aber jeder mit einem anderen Spaltennamen. Die Zeilenindizes haben keine Bedeutung. Ich möchte sie in einen einzigen, sehr langen, einspaltigen Datenrahmen einfügen.
Wenn ich pd.concat(res)
mache ich bekomme eine Spalte pro Eingabedatei (und lädt und lädt von NaN-Zellen). Ich habe verschiedene Werte für die Parameter (*) ausprobiert, aber keine, die das tun, wonach ich suche.
Edit: Beispieldaten:
res = [
pd.DataFrame({'A':[1,2,3]}),
pd.DataFrame({'B':[9,8,7,6,5,4]}),
pd.DataFrame({'C':[100,200,300,400]}),
]
Ich habe eine hässliche-Hack-Lösung: jeden Datenrahmen kopieren und einen neuen Spaltennamen geben:
newList = []
for r in res:
r.columns = ["same"]
newList.append(r)
pd.concat(newList, ignore_index=True)
Sicher, dass nicht der beste Weg ist, es zu tun??
BTW, ist ähnlich, aber meine Frage ist noch einfacher, da ich nicht möchte, dass der Index beibehalten wird. (Ich beginne auch mit einer Liste von N einspaltigen Datenrahmen, nicht einem einzelnen N-Spalten-Datenrahmen.)
*: z.B. axis=0
ist das Standardverhalten. axis=1
gibt einen Fehler aus. join="inner"
ist nur dumm (ich bekomme nur den Index). ignore_index=True
nummeriert den Index, aber ich bekomme immer noch viele Spalten, viele NaNs.
UPDATE für leere Listen
Ich hatte Probleme mit (mit allen gegebenen Lösungen), wenn die Daten eine leere Liste haben, so etwas wie:
res = [
pd.DataFrame({'A':[1,2,3]}),
pd.DataFrame({'B':[9,8,7,6,5,4]}),
pd.DataFrame({'C':[]}),
pd.DataFrame({'D':[100,200,300,400]}),
]
Der Trick bestand darin, erzwinge den Typ, indem du .astype('float64')
hinzufügst. Z.B.
pd.Series(np.concatenate([df.values.ravel().astype('float64') for df in res]))
oder:
pd.concat(res,axis=0).astype('float64').stack().reset_index(drop=True)
Könnte sein 'pd.concat ([x.rename (Spalten = lambda c: 'same') für x in res], ignore_index = True)' – jrovegno
Danke für die Timings; es war in diesem Fall nicht zeitempfindlich, aber es ist gut, das schnellste Idiom zu kennen, falls ich es jemals für eine große Datenmenge brauche. –