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
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df.append(df2)
Antworten:
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.
quelle
df.append
innere Schleife auf, es ist eine quadratische Komplexität. Hängen Sie stattdessen DataFrames an eine Liste an und rufen Siepd.concat
am Ende auf.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,
pandas
empfehle ich dringend ein Upgrade. Es ist jetzt möglich, mit DataFrames zu arbeiten, die doppelte Indizes enthalten.quelle
pd.version.version
.pd.concat
wird dem Zweck vonrbind
in 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.
quelle
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 :(
quelle