2015-09-08 169 views
1

情节我有这个简单的数据帧df熊猫 - 根据GROUPBY指数水平

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

我想根据每个CityH列进行排序,然后用不同的颜色绘制每个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出现两次。现在问题是根据subindex对每个City,H值进行绘图。我想:

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

收到以下ValueError

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

可迭代从DF退换列,你DF不再是'groupby'但多索引DF ,所以你想'd.index.get_level_values(0).unique()' – EdChum

回答

2

d不再是groupby对象是多索引DF这就是为什么你的错误:

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 

如果你没有在groupby对象上调用apply,那么你可以访问groups

In [69]: 
g = df.groupby('City') 
g.groups 

Out[69]: 
{'AMS': [0, 1, 2], 'BOS': [3, 4, 5, 6]} 

你可能已经正确地遍历的groupby对象之前:

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 

这样你现在想要做的是使用指数级别来过滤你的DF并绘制它们:

for city in d.index.get_level_values(0).unique(): 
    d[d['City']==city].plot(x='subindex', y='H') 

产量如下图:

enter image description here

enter image description here