web-dev-qa-db-fra.com

Python Pandas - Cadres de données concat avec différentes colonnes ignorant les noms de colonne

J'ai deux pandas.DataFrames que je voudrais combiner en un seul. Les trames de données ont le même nombre de colonnes, dans le même ordre, mais ont des en-têtes de colonne dans différentes langues. Comment puis-je combiner efficacement ces trames de données?

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

La seule approche que j'ai trouvée jusqu'à présent consiste à renommer les en-têtes de colonne, puis à utiliser pd.concat([df_ger, df_uk], axis=0, ignore_index=True). Cependant, j'espère trouver une approche plus générale.

13
Axel

Si les colonnes sont toujours dans le même ordre, vous pouvez mécaniquement rename les colonnes et faire un append comme:

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))

Code de test:

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)

Résultats:

         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

À condition que vous puissiez être sûr que les structures des deux trames de données restent les mêmes, je vois deux options:

  1. Conservez les noms des colonnes de la trame de données de la langue par défaut choisie (je suppose en_GB) et copiez-les simplement:

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

    Cela fonctionne quels que soient les noms des colonnes. Cependant, techniquement, il reste renommé.

  2. Extrayez les données de la trame de données à l'aide de numpy.ndarrays, concaténez-les dans numpy et faites-en une trame de données à nouveau:

    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"])
    

    Cette solution nécessite plus de ressources, donc j'opterais pour la première.

2
C. Nitschke

Je ne sais pas si ce sera plus simple que ce que vous aviez en tête, mais si l'objectif principal est quelque chose de général, cela devrait être bien avec une hypothèse: les colonnes des deux fichiers correspondent par exemple si la date est la première colonne, la version traduite sera également la première colonne.

# 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