通过groupby对象

时间:2015-05-22 05:18:48

标签: python pandas group-by

通过pandas groupby对象正确迭代存在一个特定问题,我还不了解足以解决我问题的潜在动态。

下面是一个简短的示例代码来模拟我的问题:

import pandas as pd
from pandas import *
import random

rand = np.random.RandomState(1)
df = pd.DataFrame({'A':['foo','bar','baz']*3, 
               'B': [400,800,800,1200,400,1200,800,400,1200],
               'C': rand.randn(9), 
               'D': rand.randint(0, 20, 9)})
df.head(9)

现在我需要遍历按两列分组的数据帧' A'和' B'首先由' bar',' baz'和' foo'然后选择400,800和1200,然后从列C' C中选择值。和' D'对于情节 - 低于我的选择尝试:

for k1, gp in df.groupby(['A']):
    print '1st key =' + str(k1)
    for k2, gp in df.groupby(['B']):
        print '2nd key =' + str(k2)
        print gp[['C','D']] 

产生输出

1st key =bar
2nd key =400
      C   D
0  1.624345  14
4  0.865408  17
7 -0.761207   9
2nd key =800
      C   D
1 -0.611756  18
2 -0.528172   4
6  1.744812  13
2nd key =1200
      C  D
3 -1.072969  9
5 -2.301539  0
8  0.319039  9
1st key =baz
2nd key =400
      C   D
0  1.624345  14
4  0.865408  17
7 -0.761207   9
2nd key =800
      C   D
1 -0.611756  18
2 -0.528172   4
6  1.744812  13

真正接近我需要的是什么,但是从整个数据中列出了C和D的值。例如,他并没有抓住A' A' =' bar' ' B' = 800但是' B'的所有值无论列中的名称是什么,都是= 800;'。

我想要创建的是:

1st key =bar
2nd key =400
      C   D
4  0.865408  17
7 -0.761207   9
2nd key =800
      C   D
1 -0.611756  18
1st key =baz
2nd key =800
      C   D
2 -0.528172   4
2nd key =1200
      C   D
5 -2.301539
8  0.319039

我希望,这可以在groupby对象中实现,因为它似乎是一个干净而灵活的解决方案。我也对具有逻辑条件的循环开放,但如果可能的话,我想以groupby方式解决它。提前谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码groupby s A值,然后,对于每个这样的值,groupby再次整个数据帧由B,这就是为什么你&# 39;重新获得太多组合。

要做你想做的事,你的双循环应该groupby B值只对第一个groupby的结果:

for k1, gp1 in df.groupby(df.A):
    print '1st key', k1
    for k2, gp2 in gp1.groupby(gp1.B):
        print '2nd key', k2
        print gp2

(注意第3行的差异),输出

1st key bar
2nd key 400
     A    B         C   D
4  bar  400  0.865408  17
7  bar  400 -0.761207   9
2nd key 800
     A    B         C   D
1  bar  800 -0.611756  18
1st key baz
2nd key 800
     A    B         C  D
2  baz  800 -0.528172  4
2nd key 1200
     A     B         C  D
5  baz  1200 -2.301539  0
8  baz  1200  0.319039  9
1st key foo
2nd key 400
     A    B         C   D
0  foo  400  1.624345  14
2nd key 800
     A    B         C   D
6  foo  800  1.744812  13
2nd key 1200
     A     B         C  D
3  foo  1200 -1.072969  9