2017-10-26 2 views
1

Ich sammle Daten von Twitter, und jeder Tweet ist in Form eines Wörterbuchs.Wie referenziere ich einen Wert in einem Wörterbuch, wenn der Wert eine Liste von Strings ist?

Mein vollständiger Datensatz ist eine Liste mit Tausenden von Tweets (eine Liste von Wörterbüchern).

Ich möchte auf die Hashtags in jedem Tweet verweisen, aber ich brauche Hilfe herauszufinden, wie dies zu tun ist.

Hier ist ein Beispiel einer Liste von zwei Teil Tweets mit relevanten Daten:

twitter_tweets = 
[{'created_at': 'Wed Oct 18 22:20:30 +0000 2017', 'id': 920776631102214144, 'entities': {'hashtags': ['#dataanalyst#', '#politics']} 'user': {'id': 119116331, 'statuses_count': 32796, 'verified': False, 'lang': 'en-'}, 'retweet_count': 0, 'favorite_count': 0} 
{'created_at': 'Wed Oct 17 12:20:36 +0000 2017', 'id': 920776631106514144, 'entities': {'hashtags': ['#california', '#nationalparks']} 'user': {'id': 119159331, 'statuses_count': 32796, 'verified': False, 'lang': 'en-gb'}, 'retweet_count': 1, 'favorite_count': 2}] 

Beachten Sie, dass die „Entitäten“ Schlüssel als Wert ein zweites Wörterbuch hat. In diesem zweiten Wörterbuch ist "hashtags" der Schlüssel und der Wert ist eine Liste von Hashtags.

Hier ist der Code, den ich eine Liste aller dieser Hashtags zu sammeln haben versucht eine Frequenz Serie zu erstellen:

def make_tweets_series(input_list, first_key, second_key): 
    final_keys_list = [] 
    for line in input_list: 
     tweets_by_key = line[first_key][second_key] 
     final_keys_list.append(tweets_by_key) 
     series_key_values = pd.Series(final_keys_list).value_counts() 

    return series_key_values 


hashtag_distribution_series = make_tweets_series(twitter_tweets, 'entities', 'hashtags') 

Dieser Code funktionieren würde, glaube ich, wenn die „Hashtags“ Wert ein String war , aber es funktioniert nicht, weil "hashtags" eine Liste von Strings ist.

Wie kann ich jedes der Hashtags in diesen Listen referenzieren und sie in eine Serie einfügen?

Meine volle Fehlermeldung, mit der Zurückverfolgungs ist wie folgt:

Traceback (most recent call last): 

    File "<ipython-input-60-7623feb35c84>", line 13, in <module> 
    hashtag_distribution_series = make_tweets_series(twitter_tweets, 'entities', 'hashtags') 

    File "<ipython-input-60-7623feb35c84>", line 6, in make_tweets_series 
    series_key_values = pd.Series(final_keys_list).value_counts() 

    File "/home/tommy/anaconda3/lib/python3.6/site-packages/pandas/core/base.py", line 938, in value_counts 
    normalize=normalize, bins=bins, dropna=dropna) 

    File "/home/tommy/anaconda3/lib/python3.6/site-packages/pandas/core/algorithms.py", line 640, in value_counts 
    keys, counts = _value_counts_arraylike(values, dropna) 

    File "/home/tommy/anaconda3/lib/python3.6/site-packages/pandas/core/algorithms.py", line 685, in _value_counts_arraylike 
    keys, counts = f(values, dropna) 

    File "pandas/_libs/hashtable_func_helper.pxi", line 356, in pandas._libs.hashtable.value_count_object (pandas/_libs/hashtable.c:29440) 

    File "pandas/_libs/hashtable_func_helper.pxi", line 367, in pandas._libs.hashtable.value_count_object (pandas/_libs/hashtable.c:29189) 

TypeError: unhashable type: 'list' 
+1

Wenn Sie einen Fehler posten, geben Sie bitte den gesamten Trace zurück – 0TTT0

+1

Ist Ihnen klar, dass Hashtags eine Zeichenfolge sein müssen, wenn sie als Schlüssel verwendet werden? was bei Ihrer Eingabe nicht der Fall ist. Nicht sicher, ob es ein Schreibfehler oder ein Fehler ist. – utengr

+0

@utengr Ja, das war ein Tippfehler. Ich werde es reparieren. – TJE

Antwort

2

list unhashable ist

wahrsten Sinne des Wortes, was es bedeutet; Sie können kein list Objekt hashen. dict s Verwenden Sie den Hash-Wert von Objekten, um Schlüssel -> Wert zu finden; es ist schneller so.

Verwenden Sie stattdessen tuple. Wenn die Liste der Zeichenfolgen zurückgegeben wird, rufen Sie einfach tuple(...) an. Tupel sind unveränderliche geordnete Sammlungen, die sich ähnlich wie Listen verhalten, außer dass sie unveränderlich und haschbar sind.

+0

Danke. Ich weiß nicht, wie man tuple() benutzt. Wo in meinem Code würde es gehen? – TJE

+1

@ThomasErnste 'series_key_values ​​= pd.Series (tuple (final_keys_list)). Value_counts()' – HyperNeutrino

+0

Ich bin mir nicht sicher, ob ich den Code so geändert habe, wie Sie es wollten. Ich habe versucht, die Zeile "series_key_values ​​= pd.Series (tuple (final_keys_list)) zu ersetzen. Value_counts()" in meinem Code statt meiner Zeile "series_key_values ​​= pd.Series (final_keys_list) .value_counts()" Ich bekomme die gleiche Fehlermeldung - - "TypeError: nicht hashbarer Typ: 'list'" – TJE

Verwandte Themen