Au-delà de SQL : transformer les données immobilières en informations exploitables avec Pandas
En matière d'analyse de données, SQL se présente comme un outil puissant, réputé pour ses solides capacités de gestion et d'interrogation de bases de données. La bibliothèque pandas en Python apporte des fonctionnalités de type SQL aux data scientists, permettant une manipulation et une analyse sophistiquées des données sans avoir besoin d'une base de données SQL traditionnelle. Dans ce qui suit, vous appliquerez des fonctions de type SQL en Python pour disséquer et comprendre les données.
Commençons.
Aperçu
Cet article est divisé en trois parties ; ils sont:
- Explorer les données avec la méthode
DataFrame.query()
de Pandas - Agrégation et regroupement de données
- Maîtriser la sélection de lignes et de colonnes dans Pandas
- Exploiter le tableau croisé dynamique pour une analyse approfondie du marché du logement
Explorer les données avec la méthode DataFrame.query()
de Pandas
La méthode DataFrame.query()
dans pandas permet la sélection de lignes en fonction d'une condition spécifiée, semblable à l'instruction SQL SELECT
. En commençant par les bases, vous filtrez les données en fonction de conditions uniques et multiples, jetant ainsi les bases d'interrogations de données plus complexes.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Load the dataset
Ames = pd.read_csv('Ames.csv')
# Simple querying: Select houses priced above $600,000
high_value_houses = Ames.query('SalePrice > 600000')
print(high_value_houses)
Dans le code ci-dessus, vous utilisez la méthode DataFrame.query()
de pandas pour filtrer les maisons dont le prix est supérieur à 600 000 $, en stockant le résultat dans un nouveau DataFrame appelé high_value_houses
. Cette méthode permet une interrogation concise et lisible des données en fonction d'une condition spécifiée sous forme de chaîne. Dans ce cas, 'SalePrice > 600000'
.
Le DataFrame résultant ci-dessous présente les propriétés de grande valeur sélectionnées. La requête restreint effectivement l'ensemble de données aux maisons dont le prix de vente dépasse 600 000 $, présentant seulement 5 propriétés qui répondent à ce critère. La vue filtrée fournit un aperçu ciblé de l'échelon supérieur du marché immobilier dans l'ensemble de données Ames, offrant un aperçu des caractéristiques et des emplacements des propriétés les plus valorisées.
PID GrLivArea ... Latitude Longitude
65 528164060 2470 ... 42.058475 -93.656810
584 528150070 2364 ... 42.060462 -93.655516
1007 528351010 4316 ... 42.051982 -93.657450
1325 528320060 3627 ... 42.053228 -93.657649
1639 528110020 2674 ... 42.063049 -93.655918
[5 rows x 85 columns]
Dans l'exemple suivant ci-dessous, explorons plus en détail les capacités de la méthode DataFrame.query()
pour filtrer l'ensemble de données Ames Housing en fonction de critères plus spécifiques. La requête sélectionne les maisons qui disposent de plus de 3 chambres (BedroomAbvGr > 3
) et dont le prix est inférieur à 300 000 $(SalePrice < 300000
). Cette combinaison de conditions est obtenue à l'aide de l'opérateur logique ET (&
), vous permettant d'appliquer simultanément plusieurs filtres à l'ensemble de données.
# Advanced querying: Select houses with more than 3 bedrooms and priced below $300,000
specific_houses = Ames.query('BedroomAbvGr > 3 & SalePrice < 300000')
print(specific_houses)
Le résultat de cette requête est stocké dans un nouveau DataFrame appelé Specific_houses
, qui contient toutes les propriétés qui satisfont aux deux conditions. En imprimant special_houses
, vous pouvez examiner les détails de maisons à la fois relativement grandes (en termes de chambres) et abordables, en ciblant un segment spécifique du marché du logement qui pourrait intéresser les familles à la recherche d'options de vie spacieuses au sein de une certaine fourchette de budget.
PID GrLivArea ... Latitude Longitude
5 908128060 1922 ... 42.018988 -93.671572
23 902326030 2640 ... 42.029358 -93.612289
33 903400180 1848 ... 42.029544 -93.627377
38 527327050 2030 ... 42.054506 -93.631560
40 528326110 2172 ... 42.055785 -93.651102
... ... ... ... ... ...
2539 905101310 1768 ... 42.033393 -93.671295
2557 905107250 1440 ... 42.031349 -93.673578
2562 535101110 1584 ... 42.048256 -93.619860
2575 905402060 1733 ... 42.027669 -93.666138
2576 909275030 2002 ... NaN NaN
[352 rows x 85 columns]
La requête avancée a réussi à identifier un total de 352 maisons à partir de l'ensemble de données Ames Housing qui répondent aux critères spécifiés : avoir plus de 3 chambres et un prix de vente inférieur à 300 000 $. Ce sous-ensemble de propriétés met en évidence une partie importante du marché qui offre des options de vie spacieuses sans casser le budget, s'adressant aux familles ou aux particuliers à la recherche d'un logement abordable mais spacieux. Pour explorer davantage la dynamique de ce sous-ensemble, visualisons la relation entre les prix de vente et les surfaces habitables au sol, avec une couche supplémentaire indiquant le nombre de chambres. Cette représentation graphique vous aidera à comprendre comment la surface habitable et le nombre de chambres influencent l'abordabilité et l'attrait de ces maisons selon les critères spécifiés.
# Visualizing the advanced query results
plt.figure(figsize=(10, 6))
sns.scatterplot(x='GrLivArea', y='SalePrice', hue='BedroomAbvGr', data=specific_houses, palette='viridis')
plt.title('Sales Price vs. Ground Living Area')
plt.xlabel('Ground Living Area (sqft)')
plt.ylabel('Sales Price ($)')
plt.legend(title='Bedrooms Above Ground')
plt.show()
Le nuage de points ci-dessus démontre de manière frappante l'interaction nuancée entre le prix de vente, la surface habitable et le nombre de chambres, soulignant les diverses options disponibles dans ce segment du marché immobilier d'Ames. Il souligne comment les espaces de vie plus grands et les chambres supplémentaires contribuent à la valeur de la propriété, offrant des informations précieuses aux acheteurs et investisseurs potentiels qui se concentrent sur des maisons spacieuses mais abordables. Cette analyse visuelle rend non seulement les données plus accessibles, mais soutient également l'utilité pratique de Pandas pour découvrir les principales tendances du marché.
Démarrez votre projet avec mon livre Le guide du débutant en science des données. Il fournit des tutoriels d'auto-apprentissage avec du code fonctionnel.
Agrégation et regroupement de données
L'agrégation et le regroupement sont essentiels à la synthèse des informations sur les données. En nous appuyant sur les techniques d’interrogation fondamentales explorées dans la première partie de votre exploration, approfondissons la puissance de l’agrégation et du regroupement de données en Python. Semblable à la clause GROUP BY
de SQL, pandas propose une méthode groupby()
robuste, vous permettant de segmenter vos données en sous-ensembles pour une analyse détaillée. Cette prochaine phase de votre parcours se concentre sur l’exploitation de ces capacités pour découvrir des modèles et des informations cachés dans l’ensemble de données Ames Housing. Plus précisément, vous examinerez les prix de vente moyens des maisons de plus de trois chambres, dont le prix est inférieur à 300 000 $, dans différents quartiers. En agrégeant ces données, vous visez à mettre en évidence la variabilité de l'accessibilité financière et de l'inventaire des logements à travers le canevas spatial d'Ames, Iowa.
# Advanced querying: Select houses with more than 3 bedrooms and priced below $300,000
specific_houses = Ames.query('BedroomAbvGr > 3 & SalePrice < 300000')
# Group by neighborhood, then calculate the average and total sale price, and count the houses
grouped_data = specific_houses.groupby('Neighborhood').agg({
'SalePrice': ['mean', 'count']
})
# Renaming the columns for clarity
grouped_data.columns = ['Average Sales Price', 'House Count']
# Round the average sale price to 2 decimal places
grouped_data['Averages Sales Price'] = grouped_data['Average Sales Price'].round(2)
print(grouped_data)
Average Sales Price House Count
Neighborhood
BrDale 113700.00 1
BrkSide 154840.00 10
ClearCr 206756.31 13
CollgCr 233504.17 12
Crawfor 199946.68 19
Edwards 142372.41 29
Gilbert 222554.74 19
IDOTRR 146953.85 13
MeadowV 135966.67 3
Mitchel 152030.77 13
NAmes 158835.59 59
NPkVill 143000.00 1
NWAmes 203846.28 39
NoRidge 272222.22 18
NridgHt 275000.00 3
OldTown 142586.72 43
SWISU 147493.33 15
Sawyer 148375.00 16
SawyerW 217952.06 16
Somerst 247333.33 3
StoneBr 270000.00 1
Timber 247652.17 6
En utilisant Seaborn pour la visualisation, visons à créer une représentation intuitive et accessible de vos données agrégées. Vous procédez à la création d'un graphique à barres qui présente le prix de vente moyen par quartier, complété par des annotations du décompte des maisons pour illustrer à la fois le prix et le volume dans un graphique unique et cohérent.
# Ensure 'Neighborhood' is a column (reset index if it was the index)
grouped_data_reset = grouped_data.reset_index().sort_values(by='Average Sales Price')
# Set the aesthetic style of the plots
sns.set_theme(style="whitegrid")
# Create the bar plot
plt.figure(figsize=(12, 8))
barplot = sns.barplot(
x='Neighborhood',
y='Average Sales Price',
data=grouped_data_reset,
palette="coolwarm",
hue='Neighborhood',
legend=False,
errorbar=None # Removes the confidence interval bars
)
# Rotate the x-axis labels for better readability
plt.xticks(rotation=45)
# Annotate each bar with the house count, using enumerate to access the index for positioning
for index, value in enumerate(grouped_data_reset['Average Sales Price']):
house_count = grouped_data_reset.loc[index, 'House Count']
plt.text(index, value, f'{house_count}', ha='center', va='bottom')
plt.title('Average Sales Price by Neighborhood', fontsize=18)
plt.xlabel('Neighborhood')
plt.ylabel('Average Sales Price ($)')
plt.tight_layout() # Adjust the layout
plt.show()
L'analyse et la visualisation ultérieure soulignent la variabilité significative de l'abordabilité et de la disponibilité des maisons répondant à des critères spécifiques (plus de trois chambres et un prix inférieur à 300 000 $) à Ames, dans l'Iowa. Cela démontre non seulement l'application pratique des fonctions de type SQL en Python pour l'analyse de données réelles, mais fournit également des informations précieuses sur la dynamique des marchés immobiliers locaux.
Maîtriser la sélection de lignes et de colonnes dans Pandas
La sélection de sous-ensembles spécifiques de données à partir de DataFrames est une nécessité fréquente. Deux méthodes puissantes à votre disposition sont DataFrame.loc[]
et DataFrame.iloc[]
. Les deux servent des objectifs similaires (sélectionner des données), mais ils diffèrent dans la manière dont ils référencent les lignes et les colonnes.
Comprendre la méthode DataFrame.loc[]
DataFrame.loc[]
is a label-based data selection method, meaning you use the labels of rows and columns to select the data. It’s highly intuitive for selecting data based on column names and row indexes when you know the specific labels you’re interested in.Syntax:
DataFrame.loc[row_label, column_label]
Objectif : sélectionnons toutes les maisons de plus de trois chambres, dont le prix est inférieur à 300 000 $, dans des quartiers spécifiques connus pour leurs prix de vente moyens plus élevés (en fonction de vos conclusions précédentes), et affichons leur "Quartier", " SalePrice' et 'GrLivArea'.
# Assuming 'high_value_neighborhoods' is a list of neighborhoods with higher average sale prices
high_value_neighborhoods = ['NridgHt', 'NoRidge', 'StoneBr']
# Use df.loc[] to select houses based on your conditions and only in high-value neighborhoods
high_value_houses_specific = Ames.loc[(Ames['BedroomAbvGr'] > 3) &
(Ames['SalePrice'] < 300000) &
(Ames['Neighborhood'].isin(high_value_neighborhoods)),
['Neighborhood', 'SalePrice', 'GrLivArea']]
print(high_value_houses_specific.head())
Neighborhood SalePrice GrLivArea
40 NoRidge 291000 2172
162 NoRidge 285000 2225
460 NridgHt 250000 2088
468 NoRidge 268000 2295
490 NoRidge 260000 2417
Comprendre la méthode DataFrame.iloc[]
En revanche, DataFrame.iloc[]
est une méthode d'indexation basée sur un emplacement entier. Cela signifie que vous utilisez des nombres entiers pour spécifier les lignes et les colonnes que vous souhaitez sélectionner. Il est particulièrement utile d’accéder aux données par leur position dans le DataFrame.
Syntaxe : DataFrame.iloc[row_position, column_position]
Objectif : le prochain objectif est de découvrir des options de logements abordables dans l'ensemble de données Ames qui ne compromettent pas l'espace, en ciblant spécifiquement les maisons avec au moins 3 chambres au-dessus du niveau du sol et dont le prix est inférieur à 300 000 $en dehors des quartiers à forte valeur ajoutée. .
# Filter for houses not in the 'high_value_neighborhoods',
# with at least 3 bedrooms above grade, and priced below $300,000
low_value_spacious_houses = Ames.loc[(~Ames['Neighborhood'].isin(high_value_neighborhoods)) &
(Ames['BedroomAbvGr'] >= 3) &
(Ames['SalePrice'] < 300000)]
# Sort these houses by 'SalePrice' to highlight the lower end explicitly
low_value_spacious_houses_sorted = low_value_spacious_houses.sort_values(by='SalePrice').reset_index(drop=True)
# Using df.iloc to select and print the first 5 observations of such low-value houses
low_value_spacious_first_5 = low_value_spacious_houses_sorted.iloc[:5, :]
# Print only relevant columns to match the earlier high-value example: 'Neighborhood', 'SalePrice', 'GrLivArea'
print(low_value_spacious_first_5[['Neighborhood', 'SalePrice', 'GrLivArea']])
Neighborhood SalePrice GrLivArea
0 IDOTRR 40000 1317
1 IDOTRR 50000 1484
2 IDOTRR 55000 1092
3 Sawyer 62383 864
4 Edwards 63000 1112
Dans votre exploration de DataFrame.loc[]
et DataFrame.iloc[]
, vous avez découvert les capacités de pandas pour la sélection de lignes et de colonnes, démontrant la flexibilité et la puissance de ces méthodes dans l’analyse des données. Grâce à des exemples pratiques tirés de l'ensemble de données Ames Housing, vous avez vu comment DataFrame.loc[]
permet une sélection intuitive basée sur des étiquettes, idéale pour cibler des données spécifiques basées sur des étiquettes connues. À l'inverse, DataFrame.iloc[]
fournit un moyen précis d'accéder aux données par leur emplacement entier, offrant un outil essentiel pour la sélection de position, particulièrement utile dans les scénarios nécessitant de se concentrer sur des segments de données ou des échantillons. Qu'il s'agisse de filtrer des propriétés de grande valeur dans des quartiers sélectionnés ou d'identifier des maisons d'entrée de gamme sur un marché plus large, la maîtrise de ces techniques de sélection enrichit votre boîte à outils de science des données, permettant une exploration des données plus ciblée et plus approfondie.
Exploiter les tableaux croisés dynamiques pour une analyse approfondie du marché du logement
Au fur et à mesure que vous vous aventurez plus loin dans les profondeurs de l'ensemble de données Ames Housing, votre parcours analytique vous présente les puissantes capacités des tableaux croisés dynamiques au sein des pandas. Les tableaux croisés dynamiques constituent un outil précieux pour résumer, analyser et présenter des données complexes dans un format facilement digestible. Cette technique vous permet de croiser et de segmenter les données pour découvrir des modèles et des informations qui autrement pourraient rester cachées. Dans cette section, vous utiliserez des tableaux croisés dynamiques pour disséquer le marché immobilier de manière plus complexe, en vous concentrant sur l'interaction entre les caractéristiques du quartier, le nombre de chambres et les prix de vente.
Pour préparer le terrain pour votre analyse de tableau croisé dynamique, vous filtrez l'ensemble de données pour les maisons dont le prix est inférieur à 300 000 $et avec au moins une chambre au-dessus du sol. Ce critère se concentre sur des options de logement plus abordables, garantissant que votre analyse reste pertinente pour un public plus large. Vous procédez ensuite à la construction d'un tableau croisé dynamique qui segmente le prix de vente moyen par quartier et par nombre de chambres, dans le but de découvrir les modèles qui dictent l'abordabilité et les préférences en matière de logement au sein d'Ames.
# Import an additional library
import numpy as np
# Filter for houses priced below $300,000 and with at least 1 bedroom above grade
affordable_houses = Ames.query('SalePrice < 300000 & BedroomAbvGr > 0')
# Create a pivot table to analyze average sale price by neighborhood and number of bedrooms
pivot_table = affordable_houses.pivot_table(values='SalePrice',
index='Neighborhood',
columns='BedroomAbvGr',
aggfunc='mean').round(2)
# Fill missing values with 0 for better readability and to indicate no data for that segment
pivot_table = pivot_table.fillna(0)
# Adjust pandas display options to ensure all columns are shown
pd.set_option('display.max_columns', None)
print(pivot_table)
Jetons un coup d'œil rapide au tableau croisé dynamique avant de discuter de quelques informations.
BedroomAbvGr 1 2 3 4 5 6
Neighborhood
Blmngtn 178450.00 197931.19 0.00 0.00 0.00 0.00
Blueste 192500.00 128557.14 151000.00 0.00 0.00 0.00
BrDale 0.00 99700.00 111946.43 113700.00 0.00 0.00
BrkSide 77583.33 108007.89 140058.67 148211.11 214500.00 0.00
ClearCr 212250.00 220237.50 190136.36 209883.20 196333.33 0.00
CollgCr 154890.00 181650.00 196650.98 233504.17 0.00 0.00
Crawfor 289000.00 166345.00 193433.75 198763.94 210000.00 0.00
Edwards 59500.00 117286.27 134660.65 137332.00 191866.67 119900.00
Gilbert 0.00 172000.00 182178.30 223585.56 204000.00 0.00
Greens 193531.25 0.00 0.00 0.00 0.00 0.00
GrnHill 0.00 230000.00 0.00 0.00 0.00 0.00
IDOTRR 67378.00 93503.57 111681.13 144081.82 162750.00 0.00
Landmrk 0.00 0.00 137000.00 0.00 0.00 0.00
MeadowV 82128.57 105500.00 94382.00 128250.00 151400.00 0.00
Mitchel 176750.00 150366.67 168759.09 149581.82 165500.00 0.00
NAmes 139500.00 133098.93 146260.96 159065.22 180360.00 144062.50
NPkVill 0.00 134555.00 146163.64 143000.00 0.00 0.00
NWAmes 0.00 177765.00 183317.12 201165.00 253450.00 0.00
NoRidge 0.00 262000.00 259436.67 272222.22 0.00 0.00
NridgHt 211700.00 215458.55 264852.71 275000.00 0.00 0.00
OldTown 83333.33 105564.32 136843.57 136350.91 167050.00 97500.00
SWISU 60000.00 121044.44 132257.88 143444.44 158500.00 148633.33
Sawyer 185000.00 124694.23 138583.77 148884.62 0.00 146166.67
SawyerW 216000.00 156147.41 185192.14 211315.00 0.00 237863.25
Somerst 205216.67 191070.18 225570.39 247333.33 0.00 0.00
StoneBr 223966.67 211468.75 233750.00 270000.00 0.00 0.00
Timber 0.00 217263.64 200536.04 241202.60 279900.00 0.00
Veenker 247566.67 245150.00 214090.91 0.00 0.00 0.00
Le tableau croisé dynamique ci-dessus fournit un aperçu complet de la façon dont le prix de vente moyen varie selon les quartiers avec l'inclusion de différents nombres de chambres. Cette analyse révèle plusieurs informations clés :
- Abordabilité par quartier : vous pouvez voir en un coup d'œil quels quartiers offrent les options les plus abordables pour les maisons avec un nombre de chambres spécifique, ce qui facilite les recherches de logements ciblées.
- Impact des chambres sur le prix : le tableau met en évidence la manière dont le nombre de chambres influence les prix de vente dans chaque quartier, offrant ainsi une mesure de la prime accordée aux maisons plus grandes.
- Glaces et opportunités du marché : les zones avec des valeurs nulles indiquent un manque de logements répondant à certains critères, signalant des lacunes potentielles du marché ou des opportunités pour les promoteurs et les investisseurs.
En tirant parti des tableaux croisés dynamiques pour cette analyse, vous avez réussi à distiller des relations complexes au sein du marché immobilier d’Ames dans un format à la fois accessible et informatif. Ce processus met non seulement en valeur la puissante synergie entre les pandas et les techniques d'analyse de type SQL, mais souligne également l'importance des outils sophistiqués de manipulation de données pour découvrir des informations exploitables sur les marchés immobiliers. Aussi instructifs que soient les tableaux croisés dynamiques, leur véritable potentiel est libéré lorsqu'ils sont combinés à une analyse visuelle.
Pour éclairer davantage vos résultats et les rendre plus intuitifs, vous passerez de l’analyse numérique à la représentation visuelle. Une carte thermique est un excellent outil à cette fin, en particulier lorsqu'il s'agit de données multidimensionnelles comme celle-ci. Cependant, pour améliorer la clarté de votre carte thermique et attirer l'attention sur des données exploitables, vous utiliserez une palette de couleurs personnalisée qui met clairement en évidence les combinaisons inexistantes de nombre de quartiers et de chambres.
# Import an additional library
import matplotlib.colors
# Create a custom color map
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red", "yellow", "green"])
# Mask for "zero" values to be colored with a different shade
mask = pivot_table == 0
# Set the size of the plot
plt.figure(figsize=(14, 10))
# Create a heatmap with the mask
sns.heatmap(pivot_table,
cmap=cmap,
annot=True,
fmt=".0f",
linewidths=.5,
mask=mask,
cbar_kws={'label': 'Average Sales Price ($)'})
# Adding title and labels for clarity
plt.title('Average Sales Price by Neighborhood and Number of Bedrooms', fontsize=16)
plt.xlabel('Number of Bedrooms Above Grade', fontsize=12)
plt.ylabel('Neighborhood', fontsize=12)
# Display the heatmap
plt.show()
La carte thermique illustre de manière frappante la répartition des prix de vente moyens entre les quartiers, segmentés selon le nombre de chambres. Cette aide visuelle à code couleur montre immédiatement quels quartiers d'Ames offrent les options de logement les plus abordables pour les familles de différentes tailles. De plus, l’ombrage distinct des valeurs zéro – indiquant des combinaisons de quartiers et de nombres de chambres qui n’existent pas – est un outil essentiel pour l’analyse du marché. Il met en évidence les lacunes du marché où la demande peut exister, mais pas l'offre, offrant ainsi des informations précieuses aux promoteurs et aux investisseurs. Fait remarquable, votre analyse met également en évidence que les maisons de 6 chambres situées dans le quartier de la « Vieille Ville » sont cotées à moins de 100 000 $. Cette découverte indique une valeur exceptionnelle pour les familles nombreuses ou les investisseurs à la recherche de propriétés avec un grand nombre de chambres à des prix abordables.
Grâce à cette exploration visuelle, vous avez non seulement amélioré votre compréhension de la dynamique du marché immobilier, mais vous avez également démontré le rôle indispensable de la visualisation avancée des données dans l’analyse immobilière. Le tableau croisé dynamique, complété par la carte thermique, illustre comment des techniques sophistiquées de manipulation et de visualisation des données peuvent révéler des informations informatives sur le secteur du logement.
Lectures complémentaires
Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.
Documentation Python
- Méthode
DataFrame.query()
de Pandas - Méthode
DataFrame.groupby()
de Pandas - Méthode
DataFrame.loc[]
de Pandas - Méthode
DataFrame.iloc[]
de Pandas - Méthode
DataFrame.pivot_table()
de Pandas
Ressources
- Ensemble de données Ames
- Dictionnaire de données Ames
Résumé
Ce parcours complet à travers l'ensemble de données Ames Housing souligne la polyvalence et la force des pandas pour effectuer des analyses de données sophistiquées, atteignant ou dépassant souvent ce qui est possible avec SQL dans un environnement qui ne repose pas sur des bases de données traditionnelles. De l’identification des tendances détaillées du marché immobilier à l’identification d’opportunités d’investissement uniques, vous avez présenté une gamme de techniques qui dotent les analystes des outils nécessaires à une exploration approfondie des données. Plus précisément, vous avez appris à :
- Tirez parti de
DataFrame.query()
pour la sélection de données, à l'instar de l'instructionSELECT
de SQL. - Utilisez
DataFrame.groupby()
pour agréger et résumer les données, similaire auGROUP BY
de SQL. - Appliquez des techniques avancées de manipulation de données telles que
DataFrame.loc[]
,DataFrame.iloc[]
etDataFrame.pivot_table()
pour une analyse plus approfondie.
Avez-vous des questions? Veuillez poser vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.