Ich möchte die Wertvariablen mit zwei Kategorievariablen in Pandas kreuztabellieren und den gesamten eindeutigen Wert der Wertvariablen ermitteln.
SELECT date,carrier,count(DISTINCT host) as cnt
FROM apachelog
GROUP BY date,carrier;
Zählen Sie den eindeutigen Wert des variablen Hosts für jedes Datum und jede Trägervariable (3 Kategorien: Android, iOS, Andere).
date | Android | iOS | Other |
---|---|---|---|
2015/04/01 | 5000 | 1300 | 15 |
2015/04/02 | 5200 | 1230 | 16 |
2015/04/03 | 5300 | 1100 | 17 |
... | ... | ... | ... |
Durchschnittswert von Spalte A für jede Zelle der Kreuztabelle (Spalte B x Spalte C)
python
pd.pivot_table(df,value='A',index='B',columns='C')
Anzahl der Spalten A für jede Zelle in der Kreuztabelle (Spalte B x Spalte C)
python
pd.pivot_table(df,value='A',index='B',columns='C',aggfunc = 'count')
Summe von Spalte A für jede Zelle der Kreuztabelle (Spalte B x Spalte C)
python
pd.pivot_table(df,value='A',index='B',columns='C',aggfunc = 'sum')
Was ist also mit der Anzahl der eindeutigen Werte in Spalte A für jede Zelle? Verwenden Sie einen Lambda-Ausdruck. Wie man einen Lambda-Ausdruck schreibt, ist Lambda-Argument 1, Argument 2 ...: Verarbeitung
pivot_unique.py
import pandas as pd
#Behalten Sie die Daten im Pandas-Datenrahmen
df = pd.DataFrame(apachlog)
#Bei der folgenden Methode enthält der Wert den na-Wert.
#Datenrahmen im Voraus.info()Eine Hand, die verwendet werden kann, wenn Sie wissen, dass es kein Na gibt
pv = pd.pivot_table(df, values='host',index = 'date',columns = 'carrier',
aggfunc = lambda x:len(x.unique()))
#Die folgende Methode ist der Wert ohne den na-Wert.
pv = pd.pivot_table(df, values='host',index = 'date',columns = 'carrier',
aggfunc = lambda x:x.nunique())
Pandas-Datenrahmen können mit der to_csv-Methode im tsv-Format exportiert werden.
output.py
fout = 'output.tsv'
f = open(fout,'w',encoding = 'utf-8')
pv.to_csv(fout,sep = '\t')
f.close()
use_groupby.py
#Erstellen Sie eine Gruppe nach Objekt, indem Sie die x-Achse und die y-Achse angeben
grouped = df.groupby(['date','carrier'])
#Das Gruppieren nach zu einem Datenrahmen führt zu keinen Ergebnissen, sondern erstellt lediglich ein Gruppieren nach-Objekt für den Datenrahmen mit dem Aggregatschlüssel.
#Aggregieren Sie mit der Spalte "Host" für gruppierte Objekte.
#Die zu aggregierende Funktion ist agg(Geben Sie diesen Inhalt mit einem Lambda-Ausdruck an)
#Zählen Sie, dass na auch im eindeutigen Wert enthalten ist
grouped.host.agg(lambda x: len(x.unique()))
#Zähle ohne na
grouped.host.agg(lambda x: x.nunique())
Das aggregierte Ergebnis der groupby-Methode ist eine Tabelle mit "vertikalem Halten" (= langer Typ).
date | carrier | |
---|---|---|
2015/04/01 | Android | 5000 |
2015/04/01 | iOS | 1300 |
2015/04/01 | Other | 15 |
2015/04/02 | Android | 5200 |
... | ... | ... |
Wenn Sie "vertikales Halten" (langer Typ) auf Kreuztyp (?) (= Breiter Typ) erweitern möchten, verwenden Sie die unten gezeigte *** Unstack-Methode ***, um das obige aggregierte Bild anzuzeigen. Du kannst es haben.
#g = grouped.host.agg(lambda x: len(x.unique()))
g = grouped.host.agg(lambda x: x.nunique()))
g.unstack()
Recommended Posts