Ich bin so verwirrt mit verschiedenen Indizierungsmethoden, die ilocin 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 werdenNaNalle 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.