如何在不同列上对值进行分组

时间:2016-12-29 17:53:46

标签: python pandas

我有以下数据框:

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

我可以按以下方式计算每DURATION的平均HOUR

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

现在,我还需要对存储在GROUP_1GROUP_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()

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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()