pandas - 根据groupby索引级别

时间:2015-09-08 08:51:55

标签: python pandas matplotlib

我有这个简单的数据框df

City,H
AMS,1.1
AMS,0.8
AMS,0.9
BOS,0.9
BOS,0.7
BOS,0.6
BOS,0.8

我想根据每个HCity列进行排序,然后使用不同的颜色绘制每个City索引。到目前为止,我从分组和排序开始:

d = df.groupby('City').apply(lambda x: x.sort('H', ascending=False))

然后,由于我想根据某种排名为每个H绘制City值,我添加了一个名为subindex的列:

d['subindex'] = d.groupby(level=0).cumcount() + 1

结果数据框为:

       City    H  subindex
City                      
AMS  0  AMS  1.1         1
     2  AMS  0.9         2
     1  AMS  0.8         3
BOS  3  BOS  0.9         1
     6  BOS  0.8         2
     4  BOS  0.7         3
     5  BOS  0.6         4

格式是我想要的,但我无法弄清楚为什么列City出现两次。现在问题是根据City为每个H绘制subindex值。我试过了:

for i, group in d:
    group.plot(x='subindex', y='H')

收到以下ValueError

for i, group in d:
ValueError: too many values to unpack

1 个答案:

答案 0 :(得分:2)

您的‘Node’ does not name a type不再是d对象,而是多索引df,这就是您收到错误的原因:

groupby

这就是In [61]: for col in d: print(col) City H subindex 现在的情况:

d

如果您未在Out[52]: City H subindex City AMS 0 AMS 1.1 1 2 AMS 0.9 2 1 AMS 0.8 3 BOS 3 BOS 0.9 1 6 BOS 0.8 2 4 BOS 0.7 3 5 BOS 0.6 4 对象上调用apply,则可以访问groupby

groups

您可以像以前一样正确地迭代In [69]: g = df.groupby('City') g.groups Out[69]: {'AMS': [0, 1, 2], 'BOS': [3, 4, 5, 6]} 对象:

groupby

因此,您现在要做的是使用索引级别来过滤您的df并绘制它们:

In [71]:
for i, group in g:
    print(i)
    print(group)

AMS
  City    H
0  AMS  1.1
1  AMS  0.8
2  AMS  0.9
BOS
  City    H
3  BOS  0.9
4  BOS  0.7
5  BOS  0.6
6  BOS  0.8

产生以下图:

enter image description here

enter image description here