python:pandas

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
python:pandas [2023/01/13 11:44] – [Concaténer] add concatenation along columns phswpython:pandas [2023/10/30 12:26] (Version actuelle) – [Renommer des colonnes] add how to name column phsw
Ligne 17: Ligne 17:
 <code python> <code python>
 df.columns df.columns
 +</code>
 +
 +Afficher tout le dataframe ([[https://www.geeksforgeeks.org/how-to-print-an-entire-pandas-dataframe-in-python/|source]]) :
 +<code python>
 +print(df.to_markdown())  # il faut installer le paquet tabulate / python3-tabulate
 +</code>
 +ou bien :
 +<code python>
 +pd.set_option("display.max_columns", None)
 +pd.set_option("display.max_rows", None)
 +pd.set_option("display.width", None)
 +</code>
 +
 +Pour afficher le dataframe en arrondissant :
 +<code python>
 +print(df.round(2))
 </code> </code>
  
Ligne 50: Ligne 66:
 <code python> <code python>
 df = df[~df["Name"].isin(["a", "b", "c", "d"])] df = df[~df["Name"].isin(["a", "b", "c", "d"])]
 +</code>
 +
 +Pour filtrer les valeurs ''None'' ([[https://stackoverflow.com/questions/45117272/pandas-filtering-none-values|source]]) :
 +<code python>
 +df = df[df["Column"].isnull()]
 +</code>
 +
 +Pour filtrer avec une fonction :
 +<code python>
 +df_all = df[df["Parameter filename"].apply(lambda x: not x.startswith("a"))]
 </code> </code>
  
Ligne 64: Ligne 90:
 <code python> <code python>
 df.dropna(subset=['Name']) df.dropna(subset=['Name'])
 +</code>
 +
 +
 +=== Changer les valeurs de données filtrées ===
 +
 +[[https://stackoverflow.com/questions/38876816/change-value-of-a-dataframe-column-based-on-a-filter|Source]]
 +<code python>
 +df.loc[df["Column A"]=="foo", "Column B"] = "bar"
 </code> </code>
  
Ligne 73: Ligne 107:
 <code python> <code python>
 df['name'] = df['name'].apply(lambda s: s.replace("_STARPU_", "").replace("FUT_", "")) df['name'] = df['name'].apply(lambda s: s.replace("_STARPU_", "").replace("FUT_", ""))
 +</code>
 +
 +
 +==== Minimum ligne par ligne de deux colonnes ====
 +
 +[[https://stackoverflow.com/questions/16989946/creating-an-element-wise-minimum-series-from-two-other-series-in-python-pandas|Source]]
 +
 +<code python>
 +pandas.concat([s1, s2], axis=1).min(axis=1)
 </code> </code>
  
Ligne 81: Ligne 124:
 to_plot = df.sort_values(by=['name']) to_plot = df.sort_values(by=['name'])
 </code> </code>
 +
 +S'il y a plusieurs niveaux de colonnes, il faut utiliser des tuples : ''by=[('Percentage', 'mean')]''.
 +
 +''ascending=False'' pour avoir un tri décroissant.
  
  
Ligne 104: Ligne 151:
 s.index.get_level_index(0)  # première valeur s.index.get_level_index(0)  # première valeur
 s.index.get_level_index(1)  # deuxième valeur s.index.get_level_index(1)  # deuxième valeur
 +</code>
 +
 +Pour n'avoir qu'un niveau d'en-tête ([[https://stackoverflow.com/questions/14507794/how-to-flatten-a-hierarchical-index-in-columns/55757002|source]]) :
 +<code python>
 +df = df.groupby(["Parameter filename", "Comm size", "Msg size"]).agg({"Collective duration": ["max"]}).reset_index()
 +df.columns = [i for i, _ in df.columns]
 +# ou :
 +df.columns = [' '.join(col).strip() for col in df.columns.values]
 </code> </code>
  
 Liste des fonctions d’agrégation possibles: [[https://cmdlinetips.com/2019/10/pandas-groupby-13-functions-to-aggregate/]] Liste des fonctions d’agrégation possibles: [[https://cmdlinetips.com/2019/10/pandas-groupby-13-functions-to-aggregate/]]
 +
 +
 +Obtenir la première ligne de chaque groupe :
 +<code python>
 +df.group("column").first()
 +</code>
  
 === Déciles === === Déciles ===
Ligne 120: Ligne 181:
 stats = df.groupby('n').agg({"gflops": ["median", percentile(0.1)]}) stats = df.groupby('n').agg({"gflops": ["median", percentile(0.1)]})
 print(stats['gflops']['percentile_10']) print(stats['gflops']['percentile_10'])
 +</code>
 +
 +
 +=== Grouper en fusionnant les contenus des cellules ===
 +
 +[[https://stackoverflow.com/questions/36392735/how-to-combine-multiple-rows-into-a-single-row-with-pandas|Source]]
 +<code python>
 +# On groupe par le contenu de la colonne A, puis les différents contenus des cellules dans la colonne B de chaque groupe sont concaténés dans une seule cellule, ce qui donne une ligne par groupe :
 +df.groupby("Column A")["Column B"].apply(" ".join).reset_index()
 </code> </code>
  
Ligne 146: Ligne 216:
 </code> </code>
  
 +Il possible de fournir une liste de colonnes.
  
  
Ligne 168: Ligne 239:
 df_starts.rename(columns={"Time start": "Time"}, inplace=True) df_starts.rename(columns={"Time start": "Time"}, inplace=True)
 </code> </code>
 +
 +Pour des colonnes qui n'avaient initialement pas de nom :
 +<code python>
 +df.columns = ["A", "B", "C"]
 +</code>
 +
 +
 +
 +==== Éclater une colonne textuelle en plusieurs colonnes ====
 +
 +[[https://stackoverflow.com/questions/14745022/how-to-split-a-dataframe-string-column-into-two-columns|Source]]
 +
 +Si les valeurs de la colonne ''Configuration'' sont de la forme ''baseline.C.openmpi.linear.1'' :
 +<code python>
 +df[['Type', 'Size', 'MPI', 'Coll', 'Iter']] = df["Configuration"].str.split('.', expand=True)
 +</code>
 +
  
  
 ==== Valeurs uniques ==== ==== Valeurs uniques ====
 +
 +Obtenir les valeurs uniques d'une colonne :
 +<code python>
 +print(df["Comm ID"].sort_values().unique()
 +</code>
  
 Obtenir les valeurs uniques d'une colonne et le nombre d’occurrences : Obtenir les valeurs uniques d'une colonne et le nombre d’occurrences :
Ligne 178: Ligne 271:
  
  
-=== Obtenir les couples uniques de deux colonnes === +Obtenir les couples uniques de deux colonnes :
 <code python> <code python>
 threads = final_df[["Thread", "Core"]].value_counts().reset_index(name='count') threads = final_df[["Thread", "Core"]].value_counts().reset_index(name='count')
 threads.drop(columns=["count"], inplace=True) threads.drop(columns=["count"], inplace=True)
 +</code>
 +
 +On peut aussi simplement utiliser ([[https://stackoverflow.com/questions/47364539/get-unique-pairs-of-columns-of-a-pandas-dataframe|source]]) :
 +<code python>
 +df[["Operation", "Datasize"]].drop_duplicates()
 </code> </code>
  
Ligne 210: Ligne 307:
 <code python> <code python>
 value = df.at[0, "P"] # [numéro de ligne, nom de colonne] value = df.at[0, "P"] # [numéro de ligne, nom de colonne]
 +</code>
 +
 +
 +=== Convertir en dictionnaire une unique ligne ===
 +
 +<code python>
 +assert(len(row) == 1)
 +row = row.squeeze().to_dict()
 +</code>
 +
 +
 +==== Transformations sur les dataframes ====
 +
 +=== Sorte de transposées ===
 +
 +Avec le dataframe suivant :
 +<code>
 +Rang Operation Valeur
 +0    A         12
 +0    B         13
 +1    A         14
 +1    B         15
 +</code>
 +Alors le code
 +<code python>
 +df.pivot(index="Rang", columns="Operation", values="Valeur")
 +</code>
 +donnera le dataframe suivant :
 +<code>
 +Rang A  B
 +0    12 13
 +1    14 15
 +</code>
 +
 +
 +
 +==== Fonction inverse d'un percentile ====
 +
 +Pour connaître quelle est la proportion de valeurs qui sont inférieures à ''x'' ([[https://stackoverflow.com/questions/26489134/whats-the-inverse-of-the-quantile-function-on-a-pandas-series|source]]) :
 +
 +<code python>
 +(df < x).astype(int).mean()
 </code> </code>
  • python/pandas.1673606642.txt.gz
  • Dernière modification : 2023/01/13 11:44
  • de phsw