2016-12-10 2 views
-1

Mit einem Text-Datei wie folgt aus:Counting Zeilenfrequenzen und Erzeugen von Ausgabedateien

a;b 
b;a 
c;d 
d;c 
e;a 
f;g 
h;b 
b;f 
b;f 
c;g 
a;b 
d;f 

Wie man es lesen kann, und zwei Ausgangstextdateien erzeugen: eine Haltung nur die Linien, die die am häufigsten Paar auftretenden für jeden Buchstaben ; und eine, die alle Paare enthält, die eines der oberen 25% der am häufigsten vorkommenden Buchstaben enthalten.

Entschuldigung, dass wir keinen Code teilen. Ich habe viele Sachen mit Listenergänzungen, Zählungen und Pandas versucht, aber nicht fließend genug.

+2

Beispielausgabe teilen – sirfz

+0

Besteht die Bestellung? Zum Beispiel, würden 'a; b' und' b; a' ein wiederkehrendes Paar sein? –

+0

Ja, Sie müssen genau definieren, was ein Paar zuerst ist, bevor eine Antwort gegeben werden kann. Pandas wären dafür ein gutes Werkzeug. –

Antwort

1

Hier ist eine Antwort ohne eingefrorenen Satz.

df1 = df.apply(sorted, 1) 
df_count =df1.groupby(['A', 'B']).size().reset_index().sort_values(0, ascending=False) 
df_count.columns = ['A', 'B', 'Count'] 

df_all = pd.concat([df_count.assign(letter=lambda x: x['A']), 
        df_count.assign(letter=lambda x: x['B'])]).sort_values(['letter', 'Count'], ascending =[True, False]) 

df_first = df_all.groupby(['letter']).first().reset_index() 

top = int(len(df_count)/4) 
df_top_25 = df_count.iloc[:top] 

------------ ältere Antwort --------

Seit Um Fragen können Sie eine gefrorene Set als Schlüssel zu einem groupby verwenden

import pandas as pd 
df = pd.read_csv('text.csv', header=None, names=['A','B'], sep=';') 
s = df.apply(frozenset, 1) 
df_count = s.value_counts().reset_index() 
df_count.columns = ['Combos', 'Count'] 

Welche werden Sie diese

Combos Count 
0 (a, b)  3 
1 (b, f)  2 
2 (d, c)  2 
3 (g, f)  1 
4 (b, h)  1 
5 (c, g)  1 
6 (d, f)  1 
7 (e, a)  1 

Um die höchste Combo für jeden Buchstaben bekommen wir diesen Datenrahmen auf mich selbst verketten und einem anderen machen Spalte, die entweder den ersten oder den zweiten Buchstaben enthält.

df_a = df_count.copy() 
df_b = df_count.copy() 

df_a['letter'] = df_a['Combos'].apply(lambda x: list(x)[0]) 
df_b['letter'] = df_b['Combos'].apply(lambda x: list(x)[1]) 

df_all = pd.concat([df_a, df_b]).sort_values(['letter', 'Count'], ascending =[True, False]) 

Und da dies nach Buchstaben und Anzahl (absteigend) sortiert ist, erhalten Sie einfach die erste Zeile jeder Gruppe.

df_first = df_all.groupby('letter').first() 

Und die oberen 25% zu erhalten, benutzen Sie einfach

top = int(len(df_count)/4) 
df_top_25 = df_count.iloc[:top] 

Und dann .to_csv zur Ausgabe verwenden, um Datei.

+0

Macht den Job. Vielen Dank! Die '.to_csv'-Dateien erscheinen mit Zeilen, die wie folgt aussehen: a; ​​frozenset (['a', 'b']); 3 'im ersten Fall, und so' 0; frozenset (['a', ' b ']); 3'in der Sekunde. Jeder glatte Weg, um sie beide als 'a; b' zu formatieren, wobei die Header 'source' und' target' sind? – textnet

+1

Um die eingefrorene Menge loszuwerden, benutze was in der zweiten Hälfte gemacht wurde: df ['source'] = df ['Combos']. Apply (lambda x: list (x) [0]) 'und' df [' target '] = df [' Combos ']. apply (lambda x: list (x) [0]) 'und die überflüssigen Spalten fallen lassen. –

+0

Kann der Code 'df_count = df.groupby (['source', 'target']). Size(). Reset_index(). Sort_values ​​(0, aufsteigend = False)' und 'df_count.Spalten = ['Quelle', 'Ziel', 'Gewicht'] 'so modifiziert werden, dass die Richtung keine Rolle spielt, d. h. a; b wird zusammen mit b gezählt; a? – textnet