2016-12-29 69 views
0

我有以下的數據幀:如何通過不同的列組值

df = 
    ID HOUR GROUP_1  GROUP_2  GROUP_3  DURATION 
    1  7  AAA   AAA   BBB   20 
    2  7  BBB   AAA   CCC   22 
    3  7  BBB   BBB   BBB   21 
    4  8  AAA   AAA   AAA   23 
    5  8  CCC   AAA   CCC   25 
    6  9  CCC   CCC   CCC   28 

如下我可以計算平均DURATIONHOUR

grouped = df.groupby("HOUR").DURATION.mean().reset_index() 

現在我需要還組由entried存儲在GROUP_1,GROUP_2GROUP_3中的組值。我想考慮每行只發生一次組,即,如果AAA在第一行中重複兩次,則應該只考慮一次。

結果應該是:

result = 
GROUP HOUR MEAN_DURATION 
AAA 7  21 
AAA 8  24 
BBB 7  21 
... 

我知道如何計算每排各組的次數,但不知道如何把一切融合在一起,以獲得期望的結果:

df.filter(regex="^GROUP").stack().reset_index(level=1, drop=True).reset_index().drop_duplicates()[0].value_counts() 

回答

3

您可以將您的組變量,一列,每行中下降重複組,然後由hourgroup組取平均值:

(pd.melt(df, id_vars=['ID', 'HOUR', 'DURATION'], value_name='GROUP') 
.drop('variable', axis=1).drop_duplicates() 
.groupby(['HOUR', 'GROUP']).DURATION.mean() 
.reset_index()) 

enter image description here

+0

如果我想添加一個restrction對於只考慮團體'AAA'和'從列表'to_be_considered = 「AAA」, 「BBB」]'BBB'。可能嗎? – Dinosaurius

+0

您可以使用'.isin()'方法過濾結果。即如果上面的結果是「mean_df」,那麼'mean_df [mean_df.GROUP.isin(to_be_considered)]'應該過濾出其他分組結果。 – Psidom

0

使用到numpymelt

groups = df.filter(like='GROUP').values 

w = groups.shape[1] 
hours = df.HOUR.values.repeat(w) 
durtn = df.DURATION.values.repeat(w) 

d1 = pd.DataFrame(
    dict(HOUR=hours, GROUP=groups.ravel(), DURATION=durtn) 
).drop_duplicates() 

d1 

    DURATION GROUP HOUR 
0   20 AAA  7 
2   20 BBB  7 
3   22 BBB  7 
4   22 AAA  7 
5   22 CCC  7 
6   21 BBB  7 
9   23 AAA  8 
12  25 CCC  8 
13  25 AAA  8 
15  28 CCC  9 

然後groupby + mean + reset_index

d1.groupby(['HOUR', 'GROUP']).mean().reset_index() 

    HOUR GROUP DURATION 
0  7 AAA  21 
1  7 BBB  21 
2  7 CCC  22 
3  8 AAA  24 
4  8 CCC  25 
5  9 CCC  28 

一起

groups = df.filter(like='GROUP').values 

w = groups.shape[1] 
hours = df.HOUR.values.repeat(w) 
durtn = df.DURATION.values.repeat(w) 

pd.DataFrame(
    dict(HOUR=hours, GROUP=groups.ravel(), DURATION=durtn) 
).drop_duplicates().groupby(
    ['HOUR', 'GROUP'] 
).mean().reset_index() 
相關問題