Pandas ne prend pas directement en charge les trames de données 3D. La structure fondamentale d'un Pandas DataFrame est bidimensionnelle (lignes et colonnes). Pour représenter des données 3D, vous devez utiliser une approche différente, généralement l'une des suivantes :
1. Données du panel (obsolètes mais pertinentes sur le plan conceptuel) :
Les pandas avaient un objet « Panel », mais il est obsolète. Il s'agissait essentiellement d'un conteneur pour plusieurs DataFrames. Bien qu'il ne soit pas directement utilisable pour le moment, il aide à comprendre l'approche conceptuelle :imaginez chaque DataFrame représentant une tranche selon une dimension.
2. Utiliser un seul DataFrame avec un MultiIndex :
C’est la méthode la plus efficace et la plus recommandée. Vous créez un MultiIndex pour vos colonnes afin de représenter la troisième dimension.
```python
importer des pandas en tant que PD
importer numpy en tant que np
Exemples de données 3D (2x3x4)
data_3d =np.random.rand(2, 3, 4)
Créer un MultiIndex pour les colonnes
tableaux =[
['A', 'A', 'B', 'B', 'C', 'C'], # Couche 1
['X', 'Y', 'X', 'Y', 'X', 'Y'] # Couche 2
]
tuples =liste (zip (* tableaux))
index =pd.MultiIndex.from_tuples(tuples, noms=['Layer1', 'Layer2'])
Remodeler les données dans un tableau 2D adapté à un DataFrame
data_2d =data_3d.reshape(2, 6)
Créer le DataFrame avec le MultiIndex
df =pd.DataFrame(data_2d, index=range(2), colonnes=index)
imprimer(df)
Accès aux données :
print("\nAccès à l'élément au niveau de Layer1='A', Layer2='X', ligne 0 :")
print(df.loc[0, ('A', 'X')])
Accéder à une tranche :
print("\nAccès à toutes les données pour Layer1='A':")
print(df.loc[:, 'A'])
#Ajout d'un nouveau calque (Layer3) :
#Besoin de restructurer les données pour cela
new_data_3d =np.random.rand(2,3,4,2) #Ajout d'une dimension
new_data_2d =new_data_3d.reshape(2,12)
tableaux =[
['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'], # Couche 1
['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y'] # Couche 2
,['Z1', 'Z1','Z1','Z1','Z1','Z1','Z1','Z1','Z1','Z1','Z1','Z1'] # Couche 3
]
tuples =liste (zip (* tableaux))
index =pd.MultiIndex.from_tuples(tuples, noms=['Layer1', 'Layer2','Layer3'])
df_new =pd.DataFrame(new_data_2d,index=range(2),colonnes=index)
print("\nDataFrame avec un nouveau Layer3 :")
imprimer(df_new)
```
3. Utilisation d'un dictionnaire de DataFrames :
C'est moins efficace qu'un MultiIndex mais offre plus de flexibilité pour les scénarios complexes.
```python
données ={}
pour moi dans la plage (2):
data[i] =pd.DataFrame(np.random.rand(3, 4))
Accès aux données :
imprimer(données[0])
```
Choisir la bonne approche :
* MultiIndex : Idéal dans la plupart des cas, offre de bonnes performances et un accès efficace aux données si votre troisième dimension est relativement petite à modérée.
* Dictionnaire des DataFrames : Mieux vaut si vous avez un nombre significativement plus grand de « couches » dans vos données 3D ou si vos différentes couches ont des structures très différentes.
N'oubliez pas de réfléchir attentivement à la manière dont vous accéderez et manipulerez vos données une fois qu'elles seront structurées de l'une de ces manières. L'approche MultiIndex est généralement préférable en raison de son efficacité et des capacités intégrées de Pandas pour travailler avec des MultiIndex. Pour les très grands ensembles de données, envisagez d'utiliser Dask ou Vaex, conçus pour le calcul hors cœur.
|