J'essaie de lier les colonnes dataframes et rencontre un problème avec pandas concat
, en tant que ignore_index=True
ne semble pas fonctionner:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 2, 3,4])
df2 = pd.DataFrame({'A1': ['A4', 'A5', 'A6', 'A7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D2': ['D4', 'D5', 'D6', 'D7']},
index=[ 5, 6, 7,3])
df1
# A B D
# 0 A0 B0 D0
# 2 A1 B1 D1
# 3 A2 B2 D2
# 4 A3 B3 D3
df2
# A1 C D2
# 5 A4 C4 D4
# 6 A5 C5 D5
# 7 A6 C6 D6
# 3 A7 C7 D7
dfs = [df1,df2]
df = pd.concat( dfs,axis=1,ignore_index=True)
print df
et le résultat est
0 1 2 3 4 5
0 A0 B0 D0 NaN NaN NaN
2 A1 B1 D1 NaN NaN NaN
3 A2 B2 D2 A7 C7 D7
4 A3 B3 D3 NaN NaN NaN
5 NaN NaN NaN A4 C4 D4
6 NaN NaN NaN A5 C5 D5
7 NaN NaN NaN A6 C6 D6
Même si je réinitialise l'index en utilisant
df1.reset_index()
df2.reset_index()
et ensuite essayer
pd.concat([df1,df2],axis=1)
il produit toujours le même résultat!
Si je vous ai bien compris, c'est ce que vous aimeriez faire.
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 2, 3,4])
df2 = pd.DataFrame({'A1': ['A4', 'A5', 'A6', 'A7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D2': ['D4', 'D5', 'D6', 'D7']},
index=[ 4, 5, 6 ,7])
df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
df = pd.concat( [df1, df2], axis=1)
Qui donne:
A B D A1 C D2
0 A0 B0 D0 A4 C4 D4
1 A1 B1 D1 A5 C5 D5
2 A2 B2 D2 A6 C6 D6
3 A3 B3 D3 A7 C7 D7
En fait, je m'attendais à ce que df = pd.concat(dfs,axis=1,ignore_index=True)
donne le même résultat.
C'est l'excellente explication de jreback:
ignore_index=True
"Ignore", ce qui signifie que ne s’aligne pas sur l’axe de jonction. il les colle simplement dans l'ordre dans lequel ils ont été passés, puis réaffecte une plage pour l'index réel (par exemple,range(len(index))
), de sorte que la différence entre les jointures sur des index non chevauchants (supposons queaxis=1
dans l’exemple), c’est que avecignore_index=False
(valeur par défaut), vous obtenez la concaténation des index et avecignore_index=True
vous obtenez une plage.
L'option ignore_index fonctionne dans votre exemple, il vous suffit de savoir qu'elle ignore le axe de concaténation qui, dans votre cas, correspond aux colonnes. (Peut-être qu'un meilleur nom serait ignore_labels.) Si vous souhaitez que la concaténation ignore les étiquettes d'index, votre variable d'axe doit être définie sur 0 (valeur par défaut).
D'accord avec les commentaires, il est toujours préférable d'afficher le résultat attendu.
Est-ce ce que vous cherchez?
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 2, 3,4])
df2 = pd.DataFrame({'A1': ['A4', 'A5', 'A6', 'A7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D2': ['D4', 'D5', 'D6', 'D7']},
index=[ 5, 6, 7,3])
df1 = df1.transpose().reset_index(drop=True).transpose()
df2 = df2.transpose().reset_index(drop=True).transpose()
dfs = [df1,df2]
df = pd.concat( dfs,axis=0,ignore_index=True)
print df
0 1 2
0 A0 B0 D0
1 A1 B1 D1
2 A2 B2 D2
3 A3 B3 D3
4 A4 C4 D4
5 A5 C5 D5
6 A6 C6 D6
7 A7 C7 D7
Merci d'avoir posé la question. J'ai eu le même problème. Pour une raison quelconque, "ignore_index = True" ne m'aide en rien. Je voulais conserver l'index du premier ensemble de données et ignorer le deuxième index, cela a fonctionné pour moi.
X_train=pd.concat([train_sp, X_train.reset_index(drop=True, inplace=True)], axis=1)