webentwicklung-frage-antwort-db.com.de

Python Pandas - Datenrahmen mit unterschiedlichen Spalten zusammenfassen, Spaltennamen ignorieren

Ich habe zwei pandas.DataFrames , die ich zu einer kombinieren möchte. Die Datenrahmen haben die gleiche Anzahl von Spalten in der gleichen Reihenfolge, aber Spaltenüberschriften in verschiedenen Sprachen. Wie kann ich diese Datenrahmen effizient kombinieren?

df_ger
index  Datum   Zahl1   Zahl2
0      1-1-17  1       2
1      2-1-17  3       4

df_uk
index  Date    No1     No2
0      1-1-17  5       6
1      2-1-17  7       8

desired output
index  Datum   Zahl1   Zahl2
0      1-1-17  1       2
1      2-1-17  3       4
2      1-1-17  5       6
3      2-1-17  7       8

Der einzige Ansatz, den ich bisher gefunden habe, ist, die Spaltenüberschriften umzubenennen und dann pd.concat([df_ger, df_uk], axis=0, ignore_index=True) zu verwenden. Ich hoffe jedoch, einen allgemeineren Ansatz zu finden.

13
Axel

Wenn die Spalten immer in der gleichen Reihenfolge sind, können Sie die Spalten mechanisch rename und das do an append wie folgt ausführen:

Code:

new_cols = {x: y for x, y in Zip(df_uk.columns, df_ger.columns)}
df_out = df_ger.append(df_uk.rename(columns=new_cols))

Testcode:

df_ger = pd.read_fwf(StringIO(
    u"""
        index  Datum   Zahl1   Zahl2
        0      1-1-17  1       2
        1      2-1-17  3       4"""),
    header=1).set_index('index')

df_uk = pd.read_fwf(StringIO(
    u"""
        index  Date    No1     No2
        0      1-1-17  5       6
        1      2-1-17  7       8"""),
    header=1).set_index('index')

print(df_uk)
print(df_ger)

new_cols = {x: y for x, y in Zip(df_uk.columns, df_ger.columns)}
df_out = df_ger.append(df_uk.rename(columns=new_cols))

print(df_out)

Ergebnisse:

         Date  No1  No2
index                  
0      1-1-17    5    6
1      2-1-17    7    8

        Datum  Zahl1  Zahl2
index                      
0      1-1-17      1      2
1      2-1-17      3      4

        Datum  Zahl1  Zahl2
index                      
0      1-1-17      1      2
1      2-1-17      3      4
0      1-1-17      5      6
1      2-1-17      7      8
8
Stephen Rauch

Vorausgesetzt, Sie können sicher sein, dass die Strukturen der beiden Datenrahmen gleich bleiben, sehe ich zwei Optionen:

  1. Behalten Sie die Namen der DataFrame-Spalten der ausgewählten Standardsprache bei (ich gehe von en_GB aus) und kopieren Sie sie einfach über:

    df_ger.columns = df_uk.columns
    df_combined = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
    

    Dies funktioniert unabhängig von den Spaltennamen. Technisch bleibt es jedoch beim Umbenennen.

  2. Ziehen Sie die Daten mit numpy.ndarrays aus dem Datenframe, verknüpfen Sie sie mit numpy und erstellen Sie erneut einen Datenframe:

    np_ger_data = df_ger.as_matrix()
    np_uk_data = df_uk.as_matrix()
    np_combined_data = numpy.concatenate([np_ger_data, np_uk_data], axis=0)
    df_combined = pd.DataFrame(np_combined_data, columns=["Date", "No1", "No2"])
    

    Diese Lösung erfordert mehr Ressourcen, daher würde ich mich für die erste entscheiden.

2
C. Nitschke

Ich bin nicht sicher, ob dies einfacher sein wird, als Sie es sich vorgestellt haben, aber wenn das Hauptziel etwas Allgemeines ist, sollte dies mit einer Annahme in Ordnung sein: Die Spalten in den beiden Dateien stimmen beispielsweise überein, wenn Datum die erste Spalte ist. Die übersetzte Version wird auch die erste Spalte sein.

# number of columns
n_columns = len(df_ger.columns)

# save final columns names
columns = df_uk.columns

# rename both columns to numbers
df_ger.columns = range(n_columns)
df_uk.columns = range(n_columns)

# concat columns
df_out = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)

# rename columns in new dataframe
df_out.columns = columns
1
osbon123