【问题标题】:How to produce a correct bar plot using Pandas and Matplotlib.pyplot, from a list of dictionaries如何使用 Pandas 和 Matplotlib.pyplot 从字典列表中生成正确的条形图
【发布时间】:2017-10-19 14:51:15
【问题描述】:

我的问题是我正在尝试创建条形图,但输出不正确。

我有一个字典列表。

每个字典都包含与来自 Twitter 的数千条推文相关的所有数据和属性。每个字典都包含作为键值组合的属性,包括推文内容、发推文的人的屏幕名称、推文的语言、推文的来源国等等。

要为语言属性创建条形图,我有一个列表理解,它尝试在列表中读取为 Pandas 数据框,并将数据输出为条形图,其中前 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 个条形图,我的数据中的前五种语言各有一个条形图。相反,我得到了下面的图表。

【问题讨论】:

  • 问题出在这里:tweets_df['lang'] = map( ... )tweets_data 是什么样的?它是一个什么样的对象?如果它是一个数据框,为什么要映射它而不是只使用tweets_data['lang'].value_counts()
  • tweets_data 是一个列表,列表中的每一项都是一个字典。每个字典都包含一条推文的所有数据。当我尝试您对 tweets_data['lang'].value_counts() 的建议时,我收到错误“TypeError:列表索引必须是整数或切片,而不是 str。”
  • print tweets_df['lang'] 的输出是什么样的?
  • 0 en 1 en 2 en 3 en 4 pt 5 sp 6 en 7 und 8 en 9 en 10 en ... 530 en 531 sp 532 en 533 en 534 it 535 en 536 pt 537 en
  • 嗯,我还不清楚为什么这不起作用。我已经制作了一些示例数据并自己尝试过,看起来还不错。如果你用这个测试列表替换tweets_data会发生什么:tweets_data = [{'lang': 'en'}, {'lang': 'pl'}, {'lang': 'en'}]

标签: python pandas dictionary twitter list-comprehension


【解决方案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 中,您可以从上面链接的答案中遵循 @Triptych 的建议,并将 map() 包装在 list() 中:

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

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2019-08-10
    • 2022-10-24
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多