2016-08-07 9 views
0

Ich versuche mich gerade an Python zu gewöhnen und versuche eine Spalte zu lesen und die sich wiederholenden Elemente aus den Strings zu zählen.Wiederholte Elemente in einer CSV-Spalte zählen

Was ich habe, so weit:

i = 0 
y = [i] 
fav_Split = row[9].split('|') 
#print fav_Split 

for x in fav_Split: 
    #print x 
    y[i] = x 
    i = i+1 

print fav_Split gibt mir:

['XA', 'MA'] 
['BA', 'MA', 'RA'] 
['EB', 'CB'] 
['JA', 'RB', 'RA'] 
['ED', 'EA', 'RB', 'KA', 'RA'] 
['SB'] 
['MA', 'ED', 'SB'] 
['EC'] 
['FA'] 
['RA', 'MA'] 
['RB'] 
['CB'] 
['AC'] 
['CB', 'MA', 'RA'] 
['AC'] 
['KA'] 
['SA', 'CB'] 
['BA', 'ED', 'MA'] 
['KA', 'ED', 'SA'] 
['AB'] 
['CA'] 
['AB'] 
['SB', 'MA'] 
['XA', 'BA', 'CA'] 
['SA', 'AB'] 
['SA', 'XA', 'CA'] 
['KA'] 
['MA', 'XA'] 
['MA'] 
['RA', 'EC', 'JA'] 
['RA'] 
['CC', 'RA'] 
['CC'] 
['CC', 'RA'] 
['SA', 'RA'] 
['RA', 'AC'] 
['XA', 'JA', 'RA'] 
['CB', 'KA', 'RA'] 
['ZZ'] 
['CB', 'SA', 'RA'] 
['MA'] 
['LA', 'RB', 'RA'] 
['XA', 'RA'] 
['GA', 'RA', 'LA'] 

print x gibt mir:

XA 
MA 
BA 
MA 
RA 
EB 
CB 
JA 
RB 
RA 
ED 
EA 
RB 
KA 
RA 
SB 
MA 
ED 
SB 
EC 
FA 
RA 
MA 
RB 
CB 
AC 
CB 
MA 
RA 
AC 
KA 
SA 
CB 
BA 
ED 
MA 
KA 
ED 
SA 
AB 
CA 
AB 
SB 
MA 
XA 
BA 
CA 
SA 
AB 
SA 
XA 
CA 
KA 
MA 
XA 
MA 
RA 
EC 
JA 
RA 
CC 
RA 
CC 
CC 
RA 
SA 
RA 
RA 
AC 
XA 
JA 
RA 
CB 
KA 
RA 
ZZ 
CB 
SA 
RA 
MA 
LA 
RB 
RA 
XA 
RA 
GA 
RA 
LA 

Was ist das, was ich will. Ich versuche, diese separaten Vars in ein Array zu lesen und sie einfach danach zu zählen. Aber ich erhalte einen Fehler beim Versuch, in das y-Array zu lesen

y[i] = x 
    IndexError: list assignment index out of range 

Kann mir jemand dabei helfen? Meine nächsten Schritte zählen die sich wiederholenden Elemente und zeigen das oberste X an (das basierend auf Benutzereingaben geändert werden kann).

UPDATE 2: Debugging Bild: Ich verstehe nicht hier: y ist ... nicht ... sehen x als ein eigenes Element? enter image description here

UPDATE 3: für y + = x enter image description here

+0

Ich bin mir ziemlich sicher, dass diese Frage nichts mit CSV (oder Excel) zu tun hat. Das Zählen von Strings sollte nichts mit dem Ursprung dieser Strings zu tun haben. –

+0

Die Daten stammen ursprünglich aus einer CVS-Datei, das Skript liest als Ganzes CSV ein und schreibt es in eine neue CSV, ruft dann ein VBA-Makro auf, um die CSV-Daten weiter zu modifizieren, und benennt dann die CSV-Datei mit einem Zeitstempel um. .I sollte mehr angeben, denke ich: P - Ich werde die Tags entfernen, wenn es nicht notwendig ist –

+0

1. (Neu-) lesen "[ask]" --- Bilder sind _nicht_ ein Ersatz für Code. Selbst wenn die Image-Verbindung erhalten bleibt, kann sie nicht in [mcve] umgewandelt werden. Außerdem können Bilder uns nicht sagen, was Sie für falsch halten ... Sie zeigen Python nur, was Python macht, wenn Sie es ihm mitteilen (was in meinem Buch in Ordnung ist). –

Antwort

1

Zunächst lassen Sie mich Ihnen eine Verbesserung zu Ihrem ursprünglichen Code geben:

y = [] 
fav_Split = row[9].split('|') 
#print fav_Split 

for x in fav_Split: 
    y += x 

Oder noch kürzer:

fav_split = row[9].split('|') 
y = [item for sublist in fav_Split for item in sublist] 

Okay, jetzt haben wir die Liste der Zwei-Buchstaben-Codes, die Sie wollten. Der nächste Schritt ist die collections.Counter Klasse, die genau das zu sein scheint, was Sie brauchen. Sie übergeben ihm eine Liste und er berechnet das Vorkommen jedes Elements und ordnet es durch seine Vorkommen absteigend an.

import collections.Counter 
c = collections.Counter(y) 

Um die n am häufigsten vorkommenden Elemente aus der Liste zu bekommen, geben Sie einfach most_common()

c.most_common(n) 

denen

Zurück eine Liste der n am häufigsten vorkommenden Elemente und ihre Zählungen nutzen können von den häufigsten zu den geringsten.

+0

Vielen Dank! Ich werde jetzt darauf kommen, Oh –

+0

Viel Glück! Wenn es nicht funktioniert, lass es mich wissen. – Carsten

+0

Oh, ich erinnere mich, dass ich das schon früher probiert habe! Ich wusste jedoch nicht über Sammelfunktion. Mein Ergebnis für den Druck c ist: Zähler ({'XA': 1, 'MA': 1}) Zähler ({'MA': 1, 'BA': 1, 'RA': 1}) Zähler ({'CB': 1, 'EB': 1}) Zähler ({'JA': 1, 'RB': 1, 'RA': 1}) Zähler ({'ED': 1, 'KA' : 1, 'EA': 1, 'RA': 1, 'RB': 1}) Zähler ({'SB': 1}) Zähler ({'ED': 1, 'MA': 1, ' SB ': 1}) Zähler ({' EC ': 1}) .... usw. In diesem Fall scheint es, jedes separate Array als separates Element zu dieser Liste hinzuzufügen –