2014-04-28 148 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