2016-12-29 48 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() 
相关问题