module faq.faq_pandas
#
Short summary#
module ensae_teaching_cs.faq.faq_pandas
Quelques problèmes récurrents avec pandas.
Functions#
function |
truncated documentation |
---|---|
Compares two dataframe and tells if they are equal. |
|
Copies a dataframe as csv text into the clipboard. |
|
Takes the top n rows per group. |
|
Calls function read_csv … |
|
Documentation#
Quelques problèmes récurrents avec pandas.
- ensae_teaching_cs.faq.faq_pandas.df_equal(df1, df2)#
Compares two dataframe and tells if they are equal.
- Paramètres:
df1 – first dataframe
df2 – second dataframe
- Renvoie:
boolean
The function compare column one by one. It does not check the order of the columns is the same. It reorders the columns before doing the comparison.
If you need more complex comparison, you can look into function :epkg:`assert_frame_equal`_.
The function does not handle well NaN values because
numpy.nan != numpy.nan
is true. It also compares types:Comment comparer deux dataframe?
Ecrire
df1 == df2
ne compare pas deux dataframes entre deux car le sens n’est pas forcément le même pour tout le monde. Même si les valeurs sont les mêmes, est-ce l’ordre des colonnes est important ? Il faut le faire soi-même pour une comparaison spécifique à vos besoins. Le code ci-dessus compare d’abord les dimensions, ensuite compare l’ordre des colonnes puis enfin les valeursif df1.shape != df2.shape: return False l1 = list(df1.columns) l2 = list(df2.columns) l1.sort() l2.sort() if l1 != l2: return False df1 = df1[l1] df2 = df2[l2] t = (df1 == df2).all() s = set(t) return False not in s
Autres alternatives :
- ensae_teaching_cs.faq.faq_pandas.df_to_clipboard(df, **args)#
Copies a dataframe as csv text into the clipboard.
- Paramètres:
df – dataframe
args – additional parameters, such as sep, by default the separator sep is
\t
for this function until it is defined otherwise
It relies on method :epkg:`to_clipboard`_.
Copier un dataframe dans le presse-papier - clipboard
Pour récupérer un dataframe dans Excel, on peut utiliser la méthode to_excel puis ouvrir le fichier dans Excel ou le copier dans le presse-papier et le coller dans une feuille ouverte dans Excel. C’est l’objet de la méthode to_clipboard <to_clipboard:
df = pandas.DataFrame ( ... ) df.to_clipboard(sep="\t")
- ensae_teaching_cs.faq.faq_pandas.groupby_topn(df, by_keys, sort_keys, ascending=True, n=1, as_index=True)#
Takes the top n rows per group.
- Paramètres:
df – dataframe
by_keys – rows will be grouped by these columns
sort_keys – rows will be sorted by these columns
ascending – parameter associated to sord function
n – n in top n
as_index – if False, remove the index after the group by
- Renvoie:
result
top n lignes avec pandas
Grouper puis garder les premières observations de ce groupe est un problème classique. Il n’existe pas de meilleure façon de le faire, cela dépend du nombre d’obervations par groupe. Le moyen le plus simple de le faire avec pandas est :
grouper les lignes
trier les lignes dans chaque groupe
garder les premières lignes dans chaque groupe
Ceci donne
df.groupby(by_keys) .apply(lambda x: x.sort_values(sort_keys, ascending=ascending).head(head)) .reset_index(drop=True)
La dernière instruction supprimer l’index ce qui donne au dataframe final la même structure que le dataframe initial.
<<<
import pandas l = [dict(k1="a", k2="b", v=4, i=1), dict(k1="a", k2="b", v=5, i=1), dict(k1="a", k2="b", v=4, i=2), dict(k1="b", k2="b", v=1, i=2), dict(k1="b", k2="b", v=1, i=3)] df = pandas.DataFrame(l) df.groupby(["k1", "k2"]).apply( lambda x: x.sort_values(["v", "i"], ascending=True).head(1)) print(df)
>>>
k1 k2 v i 0 a b 4 1 1 a b 5 1 2 a b 4 2 3 b b 1 2 4 b b 1 3
- ensae_teaching_cs.faq.faq_pandas.read_csv(filepath_or_buffer, encoding='utf8', sep='\t', **args)#
Calls function read_csv with different defaults values. If the encoding is utf8 and the data is a file name, the function checks there is no BOM at the beginning. Otherwise, it uses the encoding
utf-8-sig
.- Paramètres:
encoding – encoding
filepath_or_buffer – filepath_or_buffer
sep – column separator
- Renvoie:
DataFrame
Caractères bizarres en utf8 et sous Windows (BOM) ?
Sous Windows, certains logiciels comme Notepad permettent d’enregister un fichier sous différents encodings. Avec l’encoding UTF8, on a parfois un problème avec le premier caractère
\ufeff
car Notepad ajoute ce qu’on appelle un BOM. Par exempleimport pandas df = pandas.read_csv("dataframe.txt",sep="\t", encoding="utf8") print(df)
Provoque une erreur des plus énervantes
UnicodeEncodeError: 'charmap' codec can't encode character '\ufeff' in position 0: character maps to <undefined>
Pour contrecarrer ceci, il suffit de modifier l’encoding par utf-8-sig
import pandas df = pandas.read_csv("dataframe.txt",sep="\t", encoding="utf-8-sig") print(df)
- ensae_teaching_cs.faq.faq_pandas.speed_dataframe()#
Comment créer un dataframe rapidement ?
Le notebook 2A.i - Mesures de vitesse sur les dataframes compare différentes manières de créer un dataframe ou un array. Quelques enseignemens :
Même si les données sont produites par un générateur, pandas les convertit en liste.
La création d’un array est plus rapide à partir d’un générateur plutôt que d’une liste.