2017-04-13 1 views
1

Ce petit sanpshot de mon dataframetrouver des pourcentages dans les bacs pour un groupe en utilisant pandas géants

city trips_in_first_30_days bins 
0 King's Landing 4 (3, 125] 
1 Astapor 0 NaN 
2 Astapor 3 (2, 3] 
3 King's Landing 9 (3, 125] 
4 Winterfell 14 (3, 125] 
5 Winterfell 2 (1, 2] 
6 Astapor 1 (0, 1] 
7 Winterfell 2 (1, 2] 
8 Winterfell 2 (1, 2] 
9 Winterfell 1 (0, 1] 
10 Winterfell 1 (0, 1] 
11 Winterfell 3 (2, 3] 
12 Winterfell 1 (0, 1] 
13 King's Landing 0 NaN 
14 Astapor 1 (0, 1] 
15 Winterfell 1 (0, 1] 
16 King's Landing 1 (0, 1] 
17 King's Landing 0 NaN 
18 King's Landing 6 (3, 125] 
19 King's Landing 0 NaN 
20 Winterfell 1 (0, 1] 
21 Astapor 1 (0, 1] 
22 Winterfell 0 NaN 
23 King's Landing 0 NaN 
24 Astapor 4 (3, 125] 
25 Winterfell 1 (0, 1] 
26 Astapor 1 (0, 1] 
27 Winterfell 3 (2, 3] 
28 Winterfell 0 NaN 
29 Astapor 1 (0, 1] 
... ... ... ... 
49970 Winterfell 2 (1, 2] 
49971 King's Landing 0 NaN 
49972 Winterfell 1 (0, 1] 
49973 Astapor 2 (1, 2] 
49974 Winterfell 1 (0, 1] 
49975 Winterfell 11 (3, 125] 
49976 King's Landing 0 NaN 
49977 Astapor 4 (3, 125] 
49978 Winterfell 1 (0, 1] 
49979 Winterfell 0 NaN 
49980 Astapor 1 (0, 1] 
49981 Astapor 0 NaN 
49982 King's Landing 0 NaN 
49983 Winterfell 1 (0, 1] 
49984 Winterfell 1 (0, 1] 
49985 Astapor 1 (0, 1] 
49986 Winterfell 0 NaN 
49987 Winterfell 3 (2, 3] 
49988 King's Landing 1 (0, 1] 
49989 Winterfell 1 (0, 1] 
49990 Astapor 1 (0, 1] 
49991 Winterfell 0 NaN 
49992 King's Landing 1 (0, 1] 
49993 Astapor 3 (2, 3] 
49994 Astapor 1 (0, 1] 
49995 King's Landing 0 NaN 
49996 Astapor 1 (0, 1] 
49997 Winterfell 0 NaN 
49998 Astapor 2 (1, 2] 
49999 Astapor 0 NaN 

df['bins'] est catégorique que je vous ai présenté en utilisant pd.cut pour mettre trips_in_first_30_days dans différents bacs .

Maintenant, je voudrais savoir quand groupé par ville quel pourcentage de trips_in_first_30_days chute dans divers bacs?

Par exemple, pour la ville Astapor combien de pour cent trips_in_first_30_days baisse (0,1];? Combien dans (1,2] et ainsi de suite

Est-il possible de le faire du tout comme bacs sontDTYPE catégorie et ne peuvent pas avoir des opérations effectuées sur et comment accomplir cette

EDIT:?

sur essayer la solution proposée:

def calc_bin_percentage(group_df): 
bins_count = group_df.groupby("bins")["trips_in_first_30_days"].count() 
return 100 * bins_count/len(group_df) 
new_df.groupby("city").apply(calc_bin_percentage) 

La eteint est la suivante:

bins (0, 1] (1, 2] (2, 3] (3, 125] 
city     
Astapor 31.105601 14.787710 6.973509 14.878432 
King's Landing 22.408687 14.471866 7.541955 20.710760 
Winterfell 28.689578 14.959719 8.017655 20.371957 

La somme des pourcentages de chacune des villes devrait être mais ce n'est pas le cas

+0

Pouvez-vous nous montrer à quoi vous attendez le résultat? – piRSquared

+0

Salut, s'il vous plaît vérifier maintenant. –

Répondre

1

Pour cela, il est utile de se rappeler que les fonctions utilisées dans apply de groupby peuvent renvoyer un objet pd.Series (cela s'appelle flexible apply dans la documentation Pandas).

Essayez le code suivant:

def calc_bin_percentage(group_df): 
    bins_count = group_df.groupby("bins")["trips_in_first_30_days"].sum() 
    return 100 * bins_count/group_df.sum() 

df.groupby("city").apply(calc_bin_percentage).unstack().fillna(0) 

Il fait le travail en deux étapes - d'abord divise les données par ville, puis pour chaque ville, calcule le pourcentage pour chaque bac. Le résultat devrait être une table avec des villes comme ligne, et des cases comme colonnes.

+0

Salut, pour une raison quelconque, dans mes données lorsque j'essaie cela, La somme des pourcentages pour chaque groupe ne correspond pas à 100. –

+0

Pourrait être en raison de la division entière. Je suppose que vous utilisez Python 2 (toutes les valeurs résultantes sont-elles des entiers?). Essayez de multiplier par '100.0' au lieu de' 100' (va forcer la division du flotteur). (En Python 3 float division est la valeur par défaut) – tmrlvi

+0

en utilisant python 3 et les valeurs résultantes sont des flottants. –