J'ai un ensemble de données ressemblant à ceci pour simplifier :

enter image description here

lst = [
       ["2015", "A"], 
       ["2015", "B"], 
       ["2015", "C"],
       ["2016", "A"],
       ["2016", "A"],
       ["2016", "B"],
       ["2016", "D"]

      ] 

df = pd.DataFrame(lst, columns =["Year", "Item"])

Je veux générer des statistiques comme les suivantes. Comment puis-je le faire avec Pandas ? Mon jeu de données actuel contient des dizaines de milliers d'observations et de nombreux éléments différents.

Je vous remercie!

enter image description here

0
Victor Wang 17 févr. 2020 à 02:16

1 réponse

Meilleure réponse

Envisagez d'exécuter des agrégats en ligne avec transform et merge sur une trame de données de toutes les valeurs possibles. Enfin, nettoyez avec les procédures fillna :

from itertools import product
...
years_items_df = pd.DataFrame(product(["2015", "2016"], list("ABCD")), 
                              columns = ["Year", "Item"])

df = (df.assign(Count = lambda x: x.groupby(["Year", "Item"])["Year"].transform("count"),
                AnnualCount = lambda x: x.groupby(["Year"])["Year"].transform("count"))
        .drop_duplicates()
        .merge(years_items_df, on=["Year", "Item"], how="right")
        .sort_values(["Year", "Item"])
        .assign(Count = lambda x: x['Count'].fillna(0),
                AnnualCount = lambda x: x['AnnualCount'].ffill(),
                Percent = lambda x: x["Count"].div(x["AnnualCount"]))
        .reset_index(drop=True)
      )

df
#    Year Item  Count  AnnualCount   Percent
# 0  2015    A    1.0          3.0  0.333333
# 1  2015    B    1.0          3.0  0.333333
# 2  2015    C    1.0          3.0  0.333333
# 3  2015    D    0.0          3.0  0.000000
# 4  2016    A    2.0          4.0  0.500000
# 5  2016    B    1.0          4.0  0.250000
# 6  2016    C    0.0          4.0  0.000000
# 7  2016    D    1.0          4.0  0.250000
1
Parfait 17 févr. 2020 à 00:38