【问题标题】:What are levels in a pandas DataFrame?pandas DataFrame 中的级别是什么?
【发布时间】:2017-12-27 09:46:07
【问题描述】:

我一直在阅读文档,许多解释和示例都将levels 视为理所当然的事情。恕我直言,文档缺乏对数据结构和定义的基本解释。

数据框中的级别是什么? MultiIndex 索引中的级别是什么?

【问题讨论】:

  • 我认为除了阅读文档之外,与stackunstackpivot 一起玩会很有帮助。

标签: python pandas dataframe multi-index


【解决方案1】:

我在分析my own question 的答案时偶然发现了这个问题,但我发现约翰的答案不够令人满意。经过一些实验,虽然我认为我理解了这些级别并决定分享:

简答:

级别是索引或列的一部分。

长答案:

我认为这个多列 DataFrame.groupby 示例很好地说明了索引级别。

假设我们有时间记录问题报告数据:

report = pd.DataFrame([
        [1, 10, 'John'],
        [1, 20, 'John'],
        [1, 30, 'Tom'],
        [1, 10, 'Bob'],
        [2, 25, 'John'],
        [2, 15, 'Bob']], columns = ['IssueKey','TimeSpent','User'])

   IssueKey  TimeSpent  User
0         1         10  John
1         1         20  John
2         1         30   Tom
3         1         10   Bob
4         2         25  John
5         2         15   Bob

这里的索引只有1级(每一行只有一个索引值标识)。该索引是人工的(运行编号),由 0 到 5 的值组成。

假设我们要将同一用户创建的所有日志合并(求和)到同一问题(以获取用户在该问题上花费的总时间)

time_logged_by_user = report.groupby(['IssueKey', 'User']).TimeSpent.sum()

IssueKey  User
1         Bob     10
          John    30
          Tom     30
2         Bob     15
          John    25

现在我们的数据索引有 2 个级别,因为多个用户记录了同一问题的时间。级别为IssueKeyUser。级别是索引的一部分(只有它们一起才能识别 DataFrame / Series 中的一行)。

作为索引一部分的级别(作为元组)可以在 Spyder 变量浏览器中很好地观察到:

拥有级别让我们有机会就我们选择的索引部分(级别)在组内汇总值。例如。如果我们想指定任何用户在某个问题上花费的最长时间,我们可以:

max_time_logged_to_an_issue = time_logged_by_user.groupby(level='IssueKey').transform('max')

IssueKey  User
1         Bob     30
          John    30
          Tom     30
2         Bob     25
          John    25

现在前 3 行的值为 30,因为它们对应于问题 1User 级别在上面的代码中被忽略)。同样的故事2

这可能很有用,例如如果我们想找出哪些用户在每个问题上花费的时间最多:

issue_owners = time_logged_by_user[time_logged_by_user == max_time_logged_to_an_issue]

IssueKey  User
1         John    30
          Tom     30
2         John    25

【讨论】:

    【解决方案2】:

    通常一个 DataFrame 有一个一维索引和列:

        x y
    0   4 1
    1   3 9
    

    这里的索引是 [0, 1],列是 ['x', 'y']。但是您可以在索引或列中有多个级别:

        x y
        a b c
    0 7 4 1 3
      8 3 9 5
    

    这里列的第一级是 ['x', 'y', 'y'],第二级是 ['a', 'b', 'c']。索引的第一级是[0, 0],第二级是[7, 8]。

    【讨论】:

    • 这个答案对于明确描述“索引级别”和“列级别”之间的区别非常有帮助。我有一个具有单个索引级别和多个列级别的 DF,这个答案帮助我理解了它!
    猜你喜欢
    • 2019-02-16
    • 2019-03-05
    • 2016-03-05
    • 2014-11-20
    • 2018-06-24
    • 2017-01-10
    • 2022-11-06
    • 2018-08-08
    相关资源
    最近更新 更多