【问题标题】:Iterating properly through groupby object通过 groupby 对象正确迭代
【发布时间】:2015-05-23 00:06:02
【问题描述】:

通过 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”和“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' = 'bar' 'B' = 800 的值,还抓取了 'B' = 800 的所有值,无论“A”列中的名称如何。

我想创建的是类似的东西:

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 方式解决它。提前致谢!

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    您的代码 groupbys A 值,然后,对于每个这样的值,groupbys 再次由 B 整个数据框,所以这就是你得到太多组合的原因。

    要做你想做的事,你的双循环应该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
    

    【讨论】:

    • 在 Python 3 中 for 中的元组解包仍然存在。仅删除了函数参数签名中的元组解包。
    • 非常感谢您迄今为止的努力和回答。但是我还没有看到一种从“C”和“D”列中正确选择数据的方法,如上一个框中所示——如何使用键 k[0] 和 k[1] 来实现这个结果?
    • 现在看这个版本。
    • 你好。太好了:采用了“真实”数据框,我必须在其中应用此循环,效果很好!以这种方式对第一个 groupby 对象进行 groupby 是我自己应该弄清楚的。为我的无知道歉 ;-)
    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2017-12-16
    • 2014-04-11
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多