正确迭代 groupby 对象
Iterating properly through groupby object
通过 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 和 select,然后是图的 'C' 和 'D' 列的值 - 低于我对 selection 的尝试:
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 方式解决它。提前致谢!
你的代码 groupby
s A 值,然后,对于每个这样的值,groupby
s 再次 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
(注意第三行的区别),输出
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
通过 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 和 select,然后是图的 'C' 和 'D' 列的值 - 低于我对 selection 的尝试:
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 方式解决它。提前致谢!
你的代码 groupby
s A 值,然后,对于每个这样的值,groupby
s 再次 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
(注意第三行的区别),输出
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