Je suis tellement confus avec différentes méthodes d'indexation utilisées ilocdans les pandas.
Disons que j'essaie de convertir un Dataframe 1-d en un Dataframe 2-d. J'ai d'abord le Dataframe 1-d suivant
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
Et je vais convertir cela en un Dataframe 2D avec la taille de 2x4. Je commence par prérégler le Dataframe 2D comme suit:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Ensuite, j'utilise for-loop pour m'aider à convertir a_df(1-d) en b_df(2-d) avec le code suivant
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Cela ne me donne que les résultats suivants
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Mais quand j'ai changé b_df.iloc[i,:]pour b_df.iloc[i][:]. Le résultat est correct comme le suivant, c'est ce que je veux
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Quelqu'un pourrait-il m'expliquer quelle est la différence entre .iloc[i,:]et .iloc[i][:]est, et pourquoi a .iloc[i][:]fonctionné dans mon exemple ci-dessus mais pas.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]affecte une série avec index[4, 5, 6, 7]à une série avec index[0, 1, 2, 3]. Il n'y a pas de chevauchement doncNaNs est assigné à tous les éléments. Jusqu'à présent, cela a du sens pour moi. Mais comme vous, je ne sais pas pourquoib_df.iloc[1][:] = ...se comporte différemment - inspecter les objetsb_df.iloc[1]etb_df.iloc[1][:]ne révèle aucune différence entre les indices. Ma meilleure supposition serait que l'attribution directe à une copie ([:]) est traitée comme un cas spécial par Pandas, ce qui lui fait ignorer l'index du cessionnaire et créer cette différence.