2015-09-08 330 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