In Ihrem ursprünglichen Code der Linie
dic[country]= dic[country]+1
ein KeyError
erhöhen sollte, da der Schlüssel noch nicht im Wörterbuch enthalten ist, wenn ein Land für erfüllt ist das erste Mal. Stattdessen sollten Sie prüfen, ob der Schlüssel vorhanden ist, und wenn nicht, den Wert auf 1
Auf der anderen Seite initialisieren, wird es nicht, weil der Scheck
if country in country_codes['English short name lower case']:
Ausbeuten False
für alle Werte: a Series
Objekt arbeitet mit indices instead of values. Sie sollten zum Beispiel überprüfen
if country in country_codes['English short name lower case'].values:
wenn Ihre list of values is short.
Für allgemeine Zählaufgaben bietet Python collections.Counter, die ein bisschen wie ein defaultdict(int)
wirkt, aber mit zusätzlichen Vorteilen. Es entfällt die Notwendigkeit für die manuelle Überprüfung der Schlüssel etc.
Wie Sie bereits DataFrame
Objekte haben, können Sie die Werkzeuge pandas bietet verwenden:
In [12]: country_codes = pd.read_csv('wikipedia-iso-country-codes.csv')
In [13]: text = pd.DataFrame({'SomeText': """Finland , Finland , Finland
...: The country where I want to be
...: Pony trekking or camping or just watch T.V.
...: Finland , Finland , Finland
...: It's the country for me
...:
...: You're so near to Russia
...: so far away from Japan
...: Quite a long way from Cairo
...: lots of miles from Vietnam
...:
...: Finland , Finland , Finland
...: The country where I want to be
...: Eating breakfast or dinner
...: or snack lunch in the hall
...: Finland , Finland , Finland
...: Finland has it all
...:
...: Read more: Monty Python - Finland Lyrics | MetroLyrics
...: """.split()})
In [14]: text[text['SomeText'].isin(
...: country_codes['English short name lower case']
...:)]['SomeText'].value_counts().to_dict()
...:
Out[14]: {'Finland': 14, 'Japan': 1}
Dies findet die Zeilen von text
wo die EINTEXT Spalte Wert ist in der Englisch Kurzbezeichnung Kleinbuchstaben Spalte von country_codes
, zählt eindeutige Werte von SomeText, und konvertiert in Wörterbuch. Das gleiche mit beschreibenden Zwischenvariablen:
In [49]: where_sometext_isin_country_codes = text['SomeText'].isin(
...: country_codes['English short name lower case'])
In [50]: filtered_text = text[where_sometext_isin_country_codes]
In [51]: value_counts = filtered_text['SomeText'].value_counts()
In [52]: value_counts.to_dict()
Out[52]: {'Finland': 14, 'Japan': 1}
Das gleiche mit Counter
:
In [23]: from collections import Counter
In [24]: dic = Counter()
...: ccs = set(country_codes['English short name lower case'])
...: for country in text['SomeText']:
...: if country in ccs:
...: dic[country] += 1
...:
In [25]: dic
Out[25]: Counter({'Finland': 14, 'Japan': 1})
oder einfach:
In [30]: ccs = set(country_codes['English short name lower case'])
In [31]: Counter(country for country in text['SomeText'] if country in ccs)
Out[31]: Counter({'Finland': 14, 'Japan': 1})
ist 'country_codes' die' dictionary'? –
Der aktuelle Code, den Sie haben, hat einen Einrückungsfehler - Sie sollten zuerst darauf achten. –
Nein, der Einzug war nur das Ergebnis meines Ausschneidens und Einfügens hier – JayDoe