2017-10-19 76 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))