Jestem tak pomylony z różnymi metodami indeksowania iloc
używanymi w pandach.
Powiedzmy, że próbuję przekonwertować ramkę danych 1-d na ramkę danych 2-d. Najpierw mam następującą 1-d ramkę danych
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
Zamierzam przekonwertować to na 2-d ramkę danych o rozmiarze 2x4
. Zaczynam od przygotowania dwuwymiarowej ramki danych w następujący sposób:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Następnie używam pętli for, aby pomóc mi w konwersji a_df
(1-d) na b_df
(2-d) za pomocą następującego kodu
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Daje mi tylko następujące wyniki
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Ale kiedy się zmieniłem b_df.iloc[i,:]
na b_df.iloc[i][:]
. Wynik jest poprawny, jak poniżej, i tego właśnie chcę
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Czy ktoś mógłby mi wyjaśnić, jaka jest różnica między .iloc[i,:]
i .iloc[i][:]
, i dlaczego .iloc[i][:]
działał w moim przykładzie powyżej, ale nie.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
przypisuje serię z indeksem[4, 5, 6, 7]
do serii z indeksem[0, 1, 2, 3]
. Nie ma nakładania się, więcNaN
s są przypisywane do wszystkich elementów. Do tego momentu ma to dla mnie sens. Ale podobnie jak ty nie jestem pewien, dlaczegob_df.iloc[1][:] = ...
zachowuje się inaczej - sprawdzanie obiektówb_df.iloc[1]
ib_df.iloc[1][:]
nie ujawnia żadnej różnicy między wskaźnikami. Domyślam się, że przypisanie bezpośrednio do copy ([:]
) jest traktowane przez Pandas jako szczególny przypadek, co powoduje, że ignoruje on indeks cesjonariusza i powoduje tę rozbieżność.