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.
Si les colonnes sont toujours dans le même ordre, vous pouvez mécaniquement rename
les colonnes et faire un append
comme:
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))
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)
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
À condition que vous puissiez être sûr que les structures des deux trames de données restent les mêmes, je vois deux options:
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é.
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.
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