2017-10-19 78 views
0

我的問題是,我正在嘗試創建柱狀圖,但輸出不正確。如何使用Pandas和Matplotlib.pyplot,從字典列表中生成正確的柱狀圖

我有一個詞典的列表。

每個字典包含與來自Twitter的數千個推文相關的所有數據和屬性。每個字典都包含以下屬性:鍵值組合,包括推文內容,推文人員的屏幕名稱,推文的語言,推文的來源國等等。

要創建我的語言屬性的條形圖,我有一個列表理解,試圖讀取列表中的熊貓數據框,並將數據輸出爲帶有5個頻率條的條形圖,用於每個最常用的5個頻率條我的推文列表中的語言。

這裏是我的語言柱狀圖代碼(注意,我的包含各鳴叫詞典列表被稱爲tweets_data)

tweets_df = pd.DataFrame() 

tweets_df['lang'] = map(lambda tweet: tweet['lang'], tweets_data) 

tweets_by_lang = tweets_df['lang'].value_counts() 

fig, ax = plt.subplots() 
ax.tick_params(axis='x', labelsize=15) 
ax.tick_params(axis='y', labelsize=10) 
ax.set_xlabel('Languages', fontsize=15) 
ax.set_ylabel('Number of tweets' , fontsize=15) 
ax.set_title('Top 5 languages', fontsize=15, fontweight='bold') 
tweets_by_lang[:5].plot(ax=ax, kind='bar', color='red') 

正如我所說的,我應該得到5個酒吧,一個用於我的數據中前五種語言中的每一種。相反,我得到下面的圖表。 enter image description here

+2

問題出在這裏:'tweets_df ['lang'] = map(...)'。 'tweets_data'看起來像什麼?它是什麼樣的對象?如果它是一個數據框,爲什麼你映射它而不是僅僅使用'tweets_data ['lang'] .value_counts()'? – ASGM

+0

tweets_data是一個列表,列表中的每個項目都是一個字典。每個字典包含單個推文的所有數據。當我嘗試你的tweets_data ['lang']的建議。value_counts() - 我得到錯誤「TypeError:列表索引必須是整數或切片,而不是str。」 – TJE

+1

'print tweets_df ['lang']'的輸出是什麼樣的? – ASGM

回答

1

你的問題是在這裏:

tweets_df['lang'] = map(lambda tweet: tweet['lang'], tweets_data) 

的問題,因爲你的意見建議,已經降到了在Python 2到3的變化在Python 2,map()返回一個列表。但在Python 3中,map() returns an iterator。提示是隻有一個值tweets_df['lang'].value_counts(),它是<map ... >迭代器對象)。

在任何的Python 2或3,您可以使用列表理解來代替:

tweet_by_lang = pd.Series([tweet['lang'] for tweet in tweets_data]).value_counts() 

或者在Python 3,你可以按照@從上面鏈接答案三聯的意見,並在list()包裹map()

tweets_df['lang'] = list(map(lambda tweet: tweet['lang'], tweets_data))