pandas DataFrame中的级别是什么?

时间:2017-07-21 11:01:03

标签: python pandas dataframe multi-index

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

数据框中的级别是多少? MultiIndex索引中的级别是多少?

2 个答案:

答案 0 :(得分:18)

我在分析my own question的答案时偶然发现了这个问题,但我没有发现John的答案足够令人满意。经过几次实验后,我认为我理解了水平并决定分享:

简答:

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

答案很长:

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

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

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 Variable资源管理器中可以很好地观察到级别是索引的一部分(作为元组):

enter image description here

拥有级别使我们有机会根据我们选择的索引部分(级别)聚合组内的值。例如。如果我们想要分配任何用户在问题上花费的最长时间,我们可以:

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,因为它们对应于问题1(上面的代码中忽略了User级别)。问题的同一个故事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

答案 1 :(得分:5)

通常,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]。