Je veux croiser les variables de valeur avec deux variables de catégorie dans les pandas et trouver la valeur unique totale des variables de valeur.
SELECT date,carrier,count(DISTINCT host) as cnt
FROM apachelog
GROUP BY date,carrier;
Comptez la valeur unique de la variable hôte pour chaque date et variable de transporteur (3 catégories: Android, iOS, Autre)
date | Android | iOS | Other |
---|---|---|---|
2015/04/01 | 5000 | 1300 | 15 |
2015/04/02 | 5200 | 1230 | 16 |
2015/04/03 | 5300 | 1100 | 17 |
... | ... | ... | ... |
Valeur moyenne de la colonne A pour chaque cellule du tableau croisé (colonne B x colonne C)
python
pd.pivot_table(df,value='A',index='B',columns='C')
Nombre de colonnes A pour chaque cellule du tableau croisé (colonne B x colonne C)
python
pd.pivot_table(df,value='A',index='B',columns='C',aggfunc = 'count')
Total de la colonne A pour chaque cellule du tableau croisé (colonne B x colonne C)
python
pd.pivot_table(df,value='A',index='B',columns='C',aggfunc = 'sum')
Alors qu'en est-il du nombre de valeurs uniques dans la colonne A pour chaque cellule? Utilisez une expression lambda. Comment écrire une expression lambda est l'argument lambda 1, l'argument 2 ...: Traitement
pivot_unique.py
import pandas as pd
#Conservez les données dans la trame de données pandas
df = pd.DataFrame(apachlog)
#Dans la méthode suivante, la valeur inclura la valeur na.
#Trame de données à l'avance.info()Une main qui peut être utilisée quand on sait qu'il n'y a pas de na
pv = pd.pivot_table(df, values='host',index = 'date',columns = 'carrier',
aggfunc = lambda x:len(x.unique()))
#La méthode suivante est la valeur à l'exclusion de la valeur na.
pv = pd.pivot_table(df, values='host',index = 'date',columns = 'carrier',
aggfunc = lambda x:x.nunique())
Les trames de données pandas peuvent être exportées au format tsv avec la méthode to_csv.
output.py
fout = 'output.tsv'
f = open(fout,'w',encoding = 'utf-8')
pv.to_csv(fout,sep = '\t')
f.close()
use_groupby.py
#Créez un groupe par objet en spécifiant l'axe des x et l'axe des y
grouped = df.groupby(['date','carrier'])
#Grouper par vers un bloc de données ne produit aucun résultat, il crée simplement un objet Group By pour le bloc de données avec la clé d'agrégation.
#Agréger avec la colonne "hôte" pour les objets groupés.
#La fonction à agréger est agg(Spécifiez ce contenu avec une expression lambda)
#compter que na est également inclus dans la valeur unique
grouped.host.agg(lambda x: len(x.unique()))
#Compte non compris na
grouped.host.agg(lambda x: x.nunique())
Le résultat agrégé de la méthode groupby est un tableau de «maintien vertical» (= type long).
date | carrier | |
---|---|---|
2015/04/01 | Android | 5000 |
2015/04/01 | iOS | 1300 |
2015/04/01 | Other | 15 |
2015/04/02 | Android | 5200 |
... | ... | ... |
Si vous souhaitez étendre le "maintien vertical" (type long) au type croisé (?) (= Type large), utilisez la *** méthode de dépilage *** comme indiqué ci-dessous pour afficher l'image agrégée ci-dessus. Tu peux l'avoir.
#g = grouped.host.agg(lambda x: len(x.unique()))
g = grouped.host.agg(lambda x: x.nunique()))
g.unstack()
Recommended Posts