2015-12-11 472 views
3

說我有以下數據框:大熊貓組數據幀

>>> Data=pd.DataFrame() 
>>> Data['Color']=['Green','Green','Green','Blue','Blue','Green','Green','Blue','Green','Yellow'] 
>>> Data['Count']=np.random.randint(0,100,10) 
>>> Data 
    Color Count 
0 Green  75 
1 Green  53 
2 Green  89 
3 Blue  66 
4 Blue  45 
5 Green  98 
6 Green  7 
7 Blue  28 
8 Green  28 
9 Yellow  7 

我如何通過雙方通過鄰接形成在同一價值的其他記錄的列「顏色」和團體組柱。例如,我希望的輸出將如下所示(請注意,'Count'列上應用的函數是任意的,但在這種情況下,我使用了sum)。

   Value 
Group Color   
0  Blue  111 
     Green  217 
     Yellow  7 
1  Blue  28 
     Green  105 
2  Green  28 

前3條記錄都對顏色相同的值,因此可用於組0的綠色。接下來的2條記錄對於顏色具有相同的值,因此在藍色組中爲0。然後還有2個綠色的記錄會將它們放入綠色的組1中。等等。

+0

這個問題不太清楚。你是什​​麼意思「組合」?兩者是什麼?只有一個DataFrame。第二個代碼塊是你想要的輸出? – iled

+0

我剛剛編輯並試圖澄清所需的輸出。 'Both'指的不僅是列'Color'上的分組,而且還要求顏色值位於由相同顏色值的其他記錄鄰接形成的組中。我認爲上面編輯的答案應該更清楚。 – AJG519

回答

2

這是一個有點棘手。 IIUC,你可以得到你想要這樣的結果:

>>> df = pd.DataFrame({'Colour': {0: 'Green', 1: 'Green', 2: 'Green', 3: 'Blue', 4: 'Blue', 5: 'Green', 6: 'Green', 7: 'Blue', 8: 'Green', 9: 'Yellow'}, 'Count': {0: 75, 1: 53, 2: 89, 3: 66, 4: 45, 5: 98, 6: 7, 7: 28, 8: 28, 9: 7}}) 
>>> cid = (df["Colour"] != df["Colour"].shift()).cumsum() 
>>> df["Group"] = cid.groupby(df["Colour"]).rank("dense") - 1 
>>> df.groupby(["Group", "Colour"]).sum() 
       Count 
Group Colour  
0  Blue  111 
     Green  217 
     Yellow  7 
1  Blue  28 
     Green  105 
2  Green  28 

這工作,因爲cid是通過切換 - 比較 - cumsum模式建立了一個「連續的簇」的ID。在我們有cid之後,我們可以按照顏色對這些簇ID進行分組,並對它們進行密集排序以獲得組ID。