2017-01-02 13 views
2

Dies ist eher eine Modellentwurfsfrage mit Python.Python: Erstellen Sie ein Modell für Berichte (mit Pandas)

Ich muss analysieren und extrahieren Daten aus mehreren Protokolldateien in ein Pandas DataFrames. Aus diesen Datenframes muss ich Berichte erstellen (als CSV, Excel usw.).

Eine Möglichkeit, eine solche Konstruktion ist eine Datei mit zwei Funktionen zu erstellen: 1. Funktionsdaten aus den Log-Datei zu extrahieren (regex ist in Ordnung) 2. Funktion der Pandas Abfrage, so etwas wie folgt aus:

def get_top1000(group): 

    return group.sort_index(by='births', ascending=False)[:1000] 
    grouped = names.groupby(['year', 'sex']) 
    top1000 = grouped.apply(get_top1000) 

Dann könnte meine Klasse alle diese Abfragen erhalten und die Berichte dafür erzeugen. Wie kann dies mit Python korrekt implementiert werden?

+0

* Wie das sein kann mit Python korrekt implementiert? * ... was wird falsch gemacht? * Meine Klasse könnte all diese Fragen erhalten und die Berichte dafür erstellen. * ... Sie möchten, dass wir Ihre Klasse erstellen? Das ist eine zu weite Frage. Sie sagen uns nichts über Ihr * Modell * oder was extrahiert und gemeldet werden muss. – Parfait

Antwort

2

Sie benötigen SeriesGroupBy.nlargest:

df = names.groupby(['year', 'sex'])['births'].nlargest(1000) 

Probe:

names = pd.DataFrame({'year':[2000,2000,2000,2000,2000], 
        'sex':['M','M','F','F','F'], 
        'births':[7,8,9,1,2]}) 

print (names) 
    births sex year 
0  7 M 2000 
1  8 M 2000 
2  9 F 2000 
3  1 F 2000 
4  2 F 2000 

df = names.groupby(['year', 'sex'])['births'] 
      .nlargest(1) 
      .reset_index(level=2, drop=True) 
      .reset_index() 
print (df) 
    year sex births 
0 2000 F  9 
1 2000 M  8 

Wenn in Ihren Daten gibt es andere Spalten, erste set_index mit diesen Spalten:

names = pd.DataFrame({'year':[2000,2000,2000,2000,2000], 
        'sex':['M','M','F','F','F'], 
        'births':[7,8,9,1,2], 
        'val':[3,2,4,5,6]}) 

print (names) 
    births sex val year 
0  7 M 3 2000 
1  8 M 2 2000 
2  9 F 4 2000 
3  1 F 5 2000 
4  2 F 6 2000 

df = names.set_index('val') \ 
      .groupby(['year', 'sex'])['births'] \ 
      .nlargest(1) \ 
      .reset_index() 
print (df) 
    year sex val births 
0 2000 F 4  9 
1 2000 M 2  8 
+1

@Julien Marrec - Vielen Dank für die Bearbeitung, +3 – jezrael

Verwandte Themen