Jestem tak pomylony z różnymi metodami indeksowania ilocuż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ęcNaNs 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ść.