Ich bin so verwirrt mit verschiedenen Indizierungsmethoden, die iloc
in Pandas verwendet werden.
Angenommen, ich versuche, einen 1-D-Datenrahmen in einen 2-D-Datenrahmen zu konvertieren. Zuerst habe ich den folgenden 1-D-Datenrahmen
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
Und ich werde das in einen 2D-Datenrahmen mit der Größe von konvertieren 2x4
. Ich beginne mit der Voreinstellung des 2D-Datenrahmens wie folgt:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Dann benutze ich die for-Schleife, um a_df
(1-d) in b_df
(2-d) mit dem folgenden Code zu konvertieren
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Es gibt mir nur die folgenden Ergebnisse
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Aber wenn ich geändert b_df.iloc[i,:]
zu b_df.iloc[i][:]
. Das Ergebnis ist wie folgt korrekt, was ich will
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Könnte mir jemand erklären, was der Unterschied zwischen .iloc[i,:]
und .iloc[i][:]
ist und warum .iloc[i][:]
in meinem obigen Beispiel funktioniert hat, aber nicht.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
weist einer Reihe mit Index[4, 5, 6, 7]
eine Reihe mit Index zu[0, 1, 2, 3]
. Es gibt keine Überlappung, daher werdenNaN
alle Elemente zugewiesen. Bis zu diesem Punkt macht es für mich Sinn. Aber wie Sie ist mir nicht klar, warum ich michb_df.iloc[1][:] = ...
anders verhalte - ich untersuche die Objekteb_df.iloc[1]
undb_df.iloc[1][:]
zeige keinen Unterschied zwischen den Indizes. Meine beste Vermutung wäre, dass das direkte Zuweisen zu einer Kopie ([:]
) von Pandas als Sonderfall behandelt wird, wodurch der Index des Empfängers ignoriert wird und diese Diskrepanz entsteht.