Je suis tellement confus avec différentes méthodes d'indexation utilisées iloc
dans 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 doncNaN
s 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.