我有以下数据框:
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_1
,GROUP_2
和GROUP_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()
答案 0 :(得分:3)
您可以将组变量转换为一列,删除每行中的重复组,然后按hour
和group
进行分组,取以平均值:
(pd.melt(df, id_vars=['ID', 'HOUR', 'DURATION'], value_name='GROUP')
.drop('variable', axis=1).drop_duplicates()
.groupby(['HOUR', 'GROUP']).DURATION.mean()
.reset_index())
答案 1 :(得分:0)
使用numpy
至melt
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()