python - pandas groupby 两列并按平均值汇总

标签 python pandas

我有一个这样的数据框:

df = pd.DataFrame()
df['id'] = [1,1,1,2,2,3,3,3,3,4,4,5]
df['view'] = ['A', 'B', 'A', 'A','B', 'A', 'B', 'A', 'A','B', 'A', 'B']
df['value'] = np.random.random(12)


    id view     value
0    1    A  0.625781
1    1    B  0.330084
2    1    A  0.024532
3    2    A  0.154651
4    2    B  0.196960
5    3    A  0.393941
6    3    B  0.607217
7    3    A  0.422823
8    3    A  0.994323
9    4    B  0.366650
10   4    A  0.649585
11   5    B  0.513923

我现在想通过“值”为每个 id 和每个 view 总结。 把这个想成有些id为了view有重复的观察,我想总结一下。例如,id 1 对 A 有两个观察值。

我试过了

res = df.groupby(['id', 'view'])['value'].mean()

这实际上几乎是我想要的,但是 pandas 将 idview 列合并为一个,这是我不想要的。

id  view
1   A       0.325157
    B       0.330084
2   A       0.154651
    B       0.196960
3   A       0.603696
    B       0.607217
4   A       0.649585
    B       0.366650
5   B       0.513923

res.shape 的维度也是 (9,)

我想要的输出是这样的:

id  view    value
1   A       0.325157
1   B       0.330084
2   A       0.154651
2   B       0.196960
3   A       0.603696
3   B       0.607217
4   A       0.649585
4   B       0.366650
5   B       0.513923

保留列名称和维度的位置以及重复 id 的位置。每个 id 应该只有 1 行用于 A 和 B。

我怎样才能做到这一点?

最佳答案

你需要reset_indexgroupby 中的参数 as_index=False ,因为您获得了 MuliIndex 并且默认情况下,较高级别的索引被稀疏化以使控制台输出看起来更容易一些:

np.random.seed(100)
df = pd.DataFrame()
df['id'] = [1,1,1,2,2,3,3,3,3,4,4,5]
df['view'] = ['A', 'B', 'A', 'A','B', 'A', 'B', 'A', 'A','B', 'A', 'B']
df['value'] = np.random.random(12)
print (df)
    id view     value
0    1    A  0.543405
1    1    B  0.278369
2    1    A  0.424518
3    2    A  0.844776
4    2    B  0.004719
5    3    A  0.121569
6    3    B  0.670749
7    3    A  0.825853
8    3    A  0.136707
9    4    B  0.575093
10   4    A  0.891322
11   5    B  0.209202
res = df.groupby(['id', 'view'])['value'].mean().reset_index()
print (res)
   id view     value
0   1    A  0.483961
1   1    B  0.278369
2   2    A  0.844776
3   2    B  0.004719
4   3    A  0.361376
5   3    B  0.670749
6   4    A  0.891322
7   4    B  0.575093
8   5    B  0.209202

res = df.groupby(['id', 'view'], as_index=False)['value'].mean()
print (res)
   id view     value
0   1    A  0.483961
1   1    B  0.278369
2   2    A  0.844776
3   2    B  0.004719
4   3    A  0.361376
5   3    B  0.670749
6   4    A  0.891322
7   4    B  0.575093
8   5    B  0.209202

关于python - pandas groupby 两列并按平均值汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42021665/

相关文章:

python - 如何将嵌套字典转换为 defaultdict?

python - 如何分组和计算其他列。 Pandas

python - 在 Python 数据框中获取一天的一部分(早上、下午、晚上、晚上)

python - 在python中查找日期列表之间的差异

python - 如何从特定时间开始按周分组

python - python 查找具有相似列的两个表之间缺失的数据

python - 我如何通过 pysftp 监视文件传输的进度

python - 如何接收 Python 中发生的命令输出?

python - 如何使用python读取文件?

python - 在文本文件上书写,重音和特殊字符显示不正确