webentwicklung-frage-antwort-db.com.de

pandas concat ignore_index funktioniert nicht

Ich versuche, Datenrahmen in Spalten zu binden und habe ein Problem mit pandas concat, as ignore_index=True scheint nicht zu funktionieren:

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   

und das Ergebnis ist

     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           

Auch wenn ich den Index mit zurücksetze

 df1.reset_index()    
 df2.reset_index() 

und dann versuche es

pd.concat([df1,df2],axis=1) 

es erzeugt immer noch das gleiche Ergebnis!

40
muon

Wenn ich Sie richtig verstanden habe, möchten Sie dies tun.

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) 

Welches gibt:

    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

Eigentlich hätte ich erwartet, dass df = pd.concat(dfs,axis=1,ignore_index=True) das gleiche Ergebnis liefert.

Dies ist die hervorragende Erklärung von jreback:

ignore_index=True "Ignoriert", dh nicht auf der Verbindungsachse ausgerichtet. es fügt sie einfach in der Reihenfolge zusammen, in der sie übergeben wurden, und weist dann einen Bereich für den tatsächlichen Index neu zu (z. B. range(len(index))), sodass die Differenz zwischen dem Zusammenfügen bei nicht überlappenden Indizes (angenommen axis=1) Das Beispiel) ist, dass Sie mit ignore_index=False (der Standardeinstellung) das Concat der Indizes und mit ignore_index=True einen Bereich erhalten.

49
cel

Die Option ignore_index funktioniert in Ihrem Beispiel. Sie müssen lediglich wissen, dass die Verkettungsachse ignoriert wird, bei der es sich in Ihrem Fall um die Spalten handelt. (Ein besserer Name wäre vielleicht ignore_labels.) Wenn die Verkettung die Indexbeschriftungen ignorieren soll, muss Ihre Achsenvariable auf 0 (Standard) gesetzt werden.

13
Alex

Stimmen Sie den Kommentaren zu, immer am besten, um die erwartete Ausgabe zu veröffentlichen.

Ist es das was du suchst?

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

Danke für die Frage. Ich hatte das gleiche Problem. Aus irgendeinem Grund hilft "ignore_index = True" in meinem Fall nicht. Ich wollte den Index aus dem ersten Datensatz behalten und den zweiten Index ignorieren, was bei mir funktioniert hat

X_train=pd.concat([train_sp, X_train.reset_index(drop=True, inplace=True)], axis=1)
0
Yury Wallet