module faq.faq_pandas#

Short summary#

module ensae_teaching_cs.faq.faq_pandas

Quelques problèmes récurrents avec pandas.

source on GitHub

Functions#

function

truncated documentation

df_equal

Compares two dataframe and tells if they are equal.

df_to_clipboard

Copies a dataframe as csv text into the clipboard.

groupby_topn

Takes the top n rows per group.

read_csv

Calls function read_csv

speed_dataframe

Documentation#

Quelques problèmes récurrents avec pandas.

source on GitHub

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 valeurs

if 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 :

source on GitHub

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")

source on GitHub

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

source on GitHub

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 exemple

import 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)

source on GitHub

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.

source on GitHub