Je suis entrain de remettre à jour, mes anciens modules. Avant, j'utilisais "append", mais il est devenu "deprecate". Je dois prendre "concat".
J'ai un problème avec l'alignement des Dataframes et Series.
Chaque fois, que je réussis, j'ai un "FutureWarning" qui apparait. Ce qui me rendu fou
Le but est d'avoir tous les "is_closed" et d'ajouter que le dernier qui n'est pas "is_closed".
J'ai essayé; avec "transpose()", avec "to_frame()", avec "merge", avec "join", ...
Voici un exemple:
#!/usr/bin/env python3
import time
import random
from datetime import datetime
import pandas as pd
counter = 0
lst_data = []
def create_fake_dico():
global counter
dico = {
"date": datetime.today(),
"key1": random.choice(["foo", "bar"]),
"key2": random.choice(["akuna", "matata"]),
"is_closed": True if counter % 5 == 0 else False
}
counter += 1
return dico
def create_dataframe(lst: list):
df = pd.DataFrame(lst)
df["date"] = pd.to_datetime(df["date"], format="s")
# df["is_closed"] = df["is_closed"].astype("boolean")
df = df.set_index("date")
return df
if __name__ == '__main__':
for _ in range(30):
# Créer un faux dictionnaire
dico = create_fake_dico()
# Ajouter le nouveau dictionnaire à la liste.
lst_data.append(dico)
# Créer un dataframe avec la liste
df = create_dataframe(lst_data)
# Recherche tous les "is_closed"
closed = df[df["is_closed"] == True]
not_closed = df[df["is_closed"] == False]
if not not_closed.empty: # On prend le dernier qui n'est pas "is_closed"
# # AVANT (GOOD But FutureWarning: deprecate warning)
# closed = closed.append(not_closed.iloc[-1])
# # APRES
# closed = pd.concat([closed, not_closed.iloc[-1]], axis=0) # Change nothing
closed = pd.concat([closed, not_closed.iloc[-1]], axis=1) # Change nothing
# # FutureWarning: In a future version, object-dtype columns with all-bool values will not be included
# # in reductions with bool_only=True. Explicitly cast to bool dtype instead.
# closed = pd.concat([closed, not_closed.iloc[-1].to_frame().T], axis=0)
print(closed)
time.sleep(.5)
J'aimerais qu'ils soient tous alignées comme ceci:
"""
key1 key2 is_closed
date
2023-01-03 17:16:54.946540 foo akuna True
2023-01-03 17:16:54.946541 bar akuna True
2023-01-03 17:16:54.946542 foo matata True
2023-01-03 17:16:55.460774 bar matata False
"""
Tous les pages qui pouvais m'aider, disent qu'il faut pd.concat([pd.Dataframe, pd.Series], axis=1)
Pourtant, j'obtiens pas le bon résultat. Qu'es-ce qui me manque?
En fait, ce n'est pas l'ordre, mais l'alignement, qui est erroné. (Bah, c'est peut-être l'ordre aussi, mdr )
Lorsque j'utilise "iloc" pour sortir le dernier élément du dataframe "not_closed", il me donne un type "Series", puisqu'il est tout seul. Ce qui est logique.
Mais, lorsque je prend cette "Series", et que je "concat" avec le dataframe "closed", l'alignement n'est pas correct. C'est comme si je pouvais pas utiliser concat avec un Dataframe et une Series.
Voici un exemple.
Lorsque je "print" le dataframe "df":
"""
date key1 key2 is_closed
0 2023-01-09 16:22:23.250757 bar matata True
1 2023-01-09 16:22:23.774513 bar matata False
2 2023-01-09 16:22:24.319875 foo akuna True
3 2023-01-09 16:22:24.844050 bar matata False
4 2023-01-09 16:22:25.386029 foo matata True
"""
Donc, ensuite je sépare les "is_closed" avec ceux qui ne le sont pas.
"""
date key1 key2 is_closed
1 2023-01-09 16:22:23.774513 bar matata False
3 2023-01-09 16:22:24.844050 bar matata False
"""
Rendu ici, j'ai besoin du dernier élément de ce dataframe. J'utilise donc "iloc[-1]"
last = not_closed.iloc[-1]
print(last)
"""
date 2023-01-09 16:22:24.844050
key1 bar
key2 matata
is_closed False
Name: 3, dtype: object
"""
Il me donne une "Series".
J'aimerais prendre cette "Series" et le concat avec le dataframe "closed"
Voici ce qu'il me sort: ( Avec pd.concat([closed, last]) )
>>> pd.concat([closed, last])
date key1 ... is_closed 0
0 2023-01-09 16:22:23.250757 bar ... True NaN
2 2023-01-09 16:22:24.319875 foo ... True NaN
4 2023-01-09 16:22:25.386029 foo ... True NaN
date NaT NaN ... NaN 2023-01-09 16:22:24.844050
key1 NaT NaN ... NaN bar
key2 NaT NaN ... NaN matata
is_closed NaT NaN ... NaN False
[7 rows x 5 columns]
Voici ce qu'il me sort: ( Avec pd.concat([closed, last], axis=1) )
>>> pd.concat([closed, last], axis=1)
date key1 ... is_closed 3
0 2023-01-09 16:22:23.250757 bar ... True NaN
2 2023-01-09 16:22:24.319875 foo ... True NaN
4 2023-01-09 16:22:25.386029 foo ... True NaN
date NaT NaN ... NaN 2023-01-09 16:22:24.844050
key1 NaT NaN ... NaN bar
key2 NaT NaN ... NaN matata
is_closed NaT NaN ... NaN False
[7 rows x 5 columns]
Je ne suis pas capable d'aligner les éléments en "rangé", comme ils étaients avant.
"""
date key1 key2 is_closed
0 2023-01-09 16:22:23.250757 bar matata True
2 2023-01-09 16:22:24.319875 foo akuna True
4 2023-01-09 16:22:25.386029 foo matata True
3 2023-01-09 16:22:24.844050 bar matata False
"""
Meme si j'ignore l'index, il ne veut rien savoir :(. L'aligement est toujours mauvais.
Pour supprimer l'avertissement, il faut convertir le type de la colonne is_closed en booléen; on peut faire comme ça ici (on convertit le dataframe issu de last avec les mêmes types que le dataframe closed):
@PB68 Le but est d'avoir uniquement le dernier élément qui n'est pas "closed". Effectivement, votre méthode est plus élégante, que ceci:
# Tri de la colonne "is_closed"
print(df.sort_values(by="is_closed", ascending=False))
# Plus élégant que ceci:
closed = df[df["is_closed"] == True]
not_closed = df[df["is_closed"] == False]
Par contre, cela de règle pas, mon problème. Puisqu'en choisissant le dernier élément (une fois "sorted_by"), avec la méthode ("iloc"), il devient quand même une Serie.
@umfred Oui, c'est exactement cela!! Il me manquait uniquement le ".astype(closed.dtypes), pour supprimer l'erreur ("FutureWarning").
Es-ce la méthode à utiliser? Je trouve cela tellement malpropre.
Je peux pas croire que c'est le seul moyen de joindre Une Serie et un Dataframe, en gardant les rangées et colonnes.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
in rust we trust !
PB68
PB68