2014-04-28 151 views
0

我已经得到了已被分组两列名分组一个数据帧,让我们说的标题是这样的:大熊猫访问GROUPBY列数据

   A, B, C, D, E, F 
IdxA, IdxB 

derp foo 1 5 6 3 2 1 
derp bar 2 3 4 1 9 0 
... 

对于每个IdxB我想所有的列表在COLS E和Fn键,目前我使用的是循环从D唯一值的列表中的唯一值对,这是这样的:

for (IdxA, IdxB), tbl in grouped: 
    pairValues = tbl[['E', 'F']].drop_duplicates() 
    E_unique = tbl['D'].unique() 
    print IdxB 
    print E_unique 
    for _, row in pairValues.iterrows(): 
     print row['E'] + ' ' + row['F'] 
    print 

我觉得有一个更好的方式来做到这一点,但我对熊猫有一点小菜......有没有更好的方法,或者我做了足够的“pythonic”w唉?

注意:单元格实际上包含文本数据而不是数字,我只是为了简单而使用数字。

一个例子输出:

IdxB Name (eg. foo) 
List of unique values belonging to IdxB (content is IP addresses) 
List of unique string pairs from ['E','F'] belonging to IdxB (content is strings) 

非常感谢

+0

你能不能给一个较长的数据为例(超过两行),也是你预期产出的一个例子? –

+0

我看错了你的问题,还是只想返回IdxA,IdxB,E,F和D的每一个独特组合? – exp1orer

+0

好吧,D是IP地址列表。 E和F都是字符串。我认为数据并不重要。我想打印(或返回)的是Idx名称,IP列表以及来自E,F的属于相应Idx的字符串列表。我将在帖子中添加一个示例输出。谢谢! – Blark

回答

0

一个起始点是重置由indexb的索引,然后组。假设你的数据框被称为DF:

def gimmeStuff(group): 
    data = group.drop_duplicates(['E', 'F']) 
    return data[['D', 'E', 'F']] 

df.reset_index(inplace=True) 
results = df.groupby('IdxB').apply(gimmeStuff) 

由于没有从你身边没有给出真实的数据,我不能做一个真正的考验 - 有可能是错别字左右,但这是我会放下的方式下。这将为您提供一个由IdxB索引的数据集,其中包含D,E,F列.D将为每个IdxB重复包含相同的值,并且E,F将为唯一组合。

更新

/编辑说,你其实可以直接组数据,如果你不想重新索引:

results = df.groupby(level=1).apply(gimmeStuff) 
+0

这看起来不错。今晚我会试一试,谢谢你的帮助! – Blark

+0

有用吗?请随时将其设置为正确的答案,以防止) – FooBar