web-dev-qa-db-fra.com

pandas concat ignore_index ne fonctionne pas

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!

40
muon

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 que axis=1 dans l’exemple), c’est que avec ignore_index=False (valeur par défaut), vous obtenez la concaténation des index et avec ignore_index=True vous obtenez une plage.

49
cel

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

13
Alex

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
3
Dickster

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)
0
Yury Wallet