【问题标题】:'DataFrame' object has no attribute 'value_counts' Why is it happening?'DataFrame' 对象没有属性 'value_counts' 为什么会这样?
【发布时间】:2019-10-17 09:33:49
【问题描述】:

我有一个名为“books”的pandas.DataFramedf,列有'title'

books = pd.DataFrame([['History of Canada', 'John'], 
                  ['World History', 'Culpher'],
                 ['American Politics', 'Millerson']
                 ], columns=['title','author'])

当我跑步时,它会显示它的系列:

   titles = books['title']
   type(titles)

pandas.core.series.Series

但是当我在regex 之后添加value_counts() 时会出现错误。

   titles.str.extract(r'(History)', flags=re.I).value_counts()

AttributeError: 'DataFrame' 对象没有属性 'value_counts'

如果您在没有 value_counts() 的情况下运行上述程序,则会运行以下结果:

    0
0   History
1   History
2   NaN
  • 为什么会出现错误?
  • 为什么会从Series变成DataFrame

【问题讨论】:

  • 请分享一些虚拟数据并解释您对这些数据的问题。尝试使您的问题陈述尽可能可重复。

标签: python pandas


【解决方案1】:
  • 为什么会出现错误?
  • 为什么从 Series 变成 DataFrame?

答案:根据docs,extract 默认返回 DataFrame,因为默认情况下 expand = True。

如果你想要Series作为输出,正确的方法是设置expand = False

如果 expand=False 并且 pat 只有一个捕获组,则返回一个系列(如果主题是系列)或索引(如果主题是索引)。

titles.str.extract(r'(History)', flags=re.I, expand=False).value_counts()

History    2
Name: title, dtype: int64

【讨论】:

  • 非常感谢。一直在拉我的头发:) 你知道为什么它会从系列变成 df 吗?
【解决方案2】:

这里的文档pandas.Series.str.extract,有一个参数调用expand

如果 expand 为 True,则返回 DataFrame,每个捕获组有一列。如果为 False,则返回 Series/Index。默认值为 True。这就是它返回数据帧的原因。

【讨论】:

    【解决方案3】:

    您可以使用 pandas.Series.str.contains() 在一行中完成。

    books.title.str.contains('History').sum()
    

    输出

    2
    

    【讨论】:

    • @Yash 你想要达到的目标甚至可以像我上面展示的那样简单地完成。您有什么特别的原因要尝试专门使用str.extract
    • 我仍在学习,但据我了解,您可以使用提取创建频率表。例如:将最后一本书命名为:“美国政治史”。如果你运行 books.title.str.contains('History', flags=re.I).sum() 输出:3 但是如果你运行:titles.str.extract(r'(History)', flags=re. I, expand=False).value_counts() 输出:history 1, History 2
    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2021-07-14
    相关资源
    最近更新 更多