Pandas-Version von rbind

75

In R können Sie zwei Datenrahmen kombinieren, indem Sie die Spalten des einen mit rbind auf den unteren Rand der Spalten des anderen kleben. Wie erreichen Sie bei Pandas dasselbe? Es scheint bizarr schwierig.

Das Verwenden von Anhängen führt zu einem schrecklichen Durcheinander, einschließlich NaNs und Dingen aus Gründen, die ich nicht verstehe. Ich versuche nur, zwei identische Frames zu "binden", die so aussehen:

EDIT: Ich habe die DataFrames auf dumme Weise erstellt, was zu Problemen führte. Append = rbind an alle Absichten und Zwecke. Siehe Antwort unten.

        0         1       2        3          4          5        6                    7
0   ADN.L  20130220   437.4   442.37   436.5000   441.9000  2775364  2013-02-20 18:47:42
1   ADM.L  20130220  1279.0  1300.00  1272.0000  1285.0000   967730  2013-02-20 18:47:42
2   AGK.L  20130220  1717.0  1749.00  1709.0000  1739.0000   834534  2013-02-20 18:47:43
3  AMEC.L  20130220  1030.0  1040.00  1024.0000  1035.0000  1972517  2013-02-20 18:47:43
4   AAL.L  20130220  1998.0  2014.50  1942.4999  1951.0000  3666033  2013-02-20 18:47:44
5  ANTO.L  20130220  1093.0  1097.00  1064.7899  1068.0000  2183931  2013-02-20 18:47:44
6   ARM.L  20130220   941.5   965.10   939.4250   951.5001  2994652  2013-02-20 18:47:45

Aber ich bekomme etwas Schreckliches:

        0         1        2        3          4         5        6                    7       0         1       2        3          4          5        6                    7
0     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADN.L  20130220   437.4   442.37   436.5000   441.9000  2775364  2013-02-20 18:47:42
1     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADM.L  20130220  1279.0  1300.00  1272.0000  1285.0000   967730  2013-02-20 18:47:42
2     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   AGK.L  20130220  1717.0  1749.00  1709.0000  1739.0000   834534  2013-02-20 18:47:43
3     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN  AMEC.L  20130220  1030.0  1040.00  1024.0000  1035.0000  1972517  2013-02-20 18:47:43
4     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   AAL.L  20130220  1998.0  2014.50  1942.4999  1951.0000  3666033  2013-02-20 18:47:44
5     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN  ANTO.L  20130220  1093.0  1097.00  1064.7899  1068.0000  2183931  2013-02-20 18:47:44
6     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ARM.L  20130220   941.5   965.10   939.4250   951.5001  2994652  2013-02-20 18:47:45
0     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADN.L  20130220   437.4   442.37   436.5000   441.9000  2775364  2013-02-20 18:47:42
1     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADM.L  20130220  1279.0  1300.00  1272.0000  1285.0000   967730  2013-02-20 18:47:42
2     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   AGK.L  20130220  1717.0  1749.00  1709.0000  1739.0000   834534  2013-02-20 18:47:43
3     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN  

Und ich verstehe nicht warum. Ich fange an, R :( zu vermissen

N. McA.
quelle
concat ist eher wie rbind als append. Siehe Kommentar von @Seth
CnrL
Speziell das Verketten mit Anhängen hat ein einfaches Beispiel:df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) df.append(df2)
Paul Rougieux
Siehe auch pandas data frame concat vs append : "append und concat [sind] fast gleichwertig" ... "Append ist der spezielle Fall (Achse = 0, join = 'äußere') von concat".
Paul Rougieux

Antworten:

43

Ah, das hängt damit zusammen, wie ich den DataFrame erstellt habe, nicht damit, wie ich sie kombiniert habe. Das lange und das kurze ist, wenn Sie einen Frame mit einer Schleife und einer Anweisung erstellen, die so aussieht:

Frame = Frame.append(pandas.DataFrame(data = SomeNewLineOfData))

Sie müssen den Index ignorieren

Frame = Frame.append(pandas.DataFrame(data = SomeNewLineOfData), ignore_index=True)

Oder Sie haben später Probleme beim Kombinieren von Daten.

N. McA.
quelle
2
Wenn ich also eine Weile zurückblicke, nachdem ich die Frage gestellt habe, denke ich, dass es erwähnenswert ist, dass dies eine schreckliche Möglichkeit ist, einen Datenrahmen zu erstellen . Es ist vorzuziehen, eine Liste von Dikten zu erstellen und dann den Konstruktor aufzurufen.
N. McA.
Oder noch besser: Rufen Sie nicht die df.appendinnere Schleife auf, es ist eine quadratische Komplexität. Hängen Sie stattdessen DataFrames an eine Liste an und rufen Sie pd.concatam Ende auf.
CS95
30

Das hat bei mir funktioniert:

import numpy as np
import pandas as pd

dates = np.asarray(pd.date_range('1/1/2000', periods=8))
df1 = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
df2 = df1.copy()
df = df1.append(df2)

Ausbeuten:

                   A         B         C         D
2000-01-01 -0.327208  0.552500  0.862529  0.493109
2000-01-02  1.039844 -2.141089 -0.781609  1.307600
2000-01-03 -0.462831  0.066505 -1.698346  1.123174
2000-01-04 -0.321971 -0.544599 -0.486099 -0.283791
2000-01-05  0.693749  0.544329 -1.606851  0.527733
2000-01-06 -2.461177 -0.339378 -0.236275  0.155569
2000-01-07 -0.597156  0.904511  0.369865  0.862504
2000-01-08 -0.958300 -0.583621 -2.068273  0.539434
2000-01-01 -0.327208  0.552500  0.862529  0.493109
2000-01-02  1.039844 -2.141089 -0.781609  1.307600
2000-01-03 -0.462831  0.066505 -1.698346  1.123174
2000-01-04 -0.321971 -0.544599 -0.486099 -0.283791
2000-01-05  0.693749  0.544329 -1.606851  0.527733
2000-01-06 -2.461177 -0.339378 -0.236275  0.155569
2000-01-07 -0.597156  0.904511  0.369865  0.862504
2000-01-08 -0.958300 -0.583621 -2.068273  0.539434

Wenn Sie noch nicht die neueste Version von verwenden, pandasempfehle ich dringend ein Upgrade. Es ist jetzt möglich, mit DataFrames zu arbeiten, die doppelte Indizes enthalten.

abudis
quelle
Gibt Pip nicht die neuesten Pandas hervor?
N. McA.
@ N.McA. Ja sollte es. Sie können es so überprüfen - pd.version.version.
Abudis
25

pd.concatwird dem Zweck von rbindin R. dienen.

import pandas as pd
df1 = pd.DataFrame({'col1': [1,2], 'col2':[3,4]})
df2 = pd.DataFrame({'col1': [5,6], 'col2':[7,8]})
print(df1)
print(df2)
print(pd.concat([df1, df2]))

Das Ergebnis sieht folgendermaßen aus:

   col1  col2
0     1     3
1     2     4
   col1  col2
0     5     7
1     6     8
   col1  col2
0     1     3
1     2     4
0     5     7
1     6     8

Wenn Sie die Dokumentation sorgfältig genug lesen, werden auch andere Vorgänge wie cbind, ..etc erläutert.

B.Mr.W.
quelle
2
import pandas as pd 
import numpy as np

Wenn Sie einen DataFrame wie diesen haben:

array = np.random.randint( 0,10, size = (2,4) )
df = pd.DataFrame(array, columns = ['A','B', 'C', 'D'], \ 
                           index = ['10aa', '20bb'] )  ### some crazy indexes
df

      A  B  C  D
10aa  4  2  4  6
20bb  5  1  0  2

Und Sie wollen fügen einige neue Zeile , die eine Liste (oder ein anderes iterable Objekt):

List = [i**3 for i in range(df.shape[1]) ]
List
[0, 1, 8, 27]

Sie sollten die Liste in ein Wörterbuch umwandeln, dessen Schlüssel den Spalten in DataFrame mit der Funktion zip () entspricht:

Dict = dict(  zip(df.columns, List)  )
Dict
{'A': 0, 'B': 1, 'C': 8, 'D': 27}

Dann können Sie die Methode append () verwenden, um ein neues Wörterbuch hinzuzufügen:

df = df.append(Dict, ignore_index=True)
df
    A   B   C   D
0   7   5   5   4
1   5   8   4   1
2   0   1   8   27

NB die Indizes droped.

Und ja, es ist nicht so einfach wie cbind () in R :(

Bem Ostap
quelle