首页 > 解决方案 > Pandas 通过基于其他列值的平均值来删除列

问题描述

这是我拥有的数据类型的模型:

    label1  label2  repetition     value
0        1       4           0  0.831011
1        1       9           0  0.698217
2        4       4           0  0.885272
3        4       9           0  0.009940
4        8       4           0  0.816476
5        8       9           0  0.069162
6        1       4           1  0.988980
7        1       9           1  0.892004
8        4       4           1  0.962106
9        4       9           1  0.367945
10       8       4           1  0.624772
11       8       9           1  0.694558

它可以像这样生成:

import random
import pandas as pd
data = []
for repe in [0,1]:
    for label1 in [1,4,8]:
        for label2 in [4,9]:
            value = random.random()
            data.append([label1, label2, repe, value])

data=pd.DataFrame(data, columns=['label1', 'label2', 'repetition', 'value'])

我想生成一个带有列的新 DataFramelabel1label2value其中 value 取所有重复的平均值。这是实现它的一种方法:

data2 = data.groupby(['label1', 'label2'])['value'].mean().reset_index()

但是在我的实际情况中,我有更多的标签列,所以我认为代码不清楚,因为读者必须推断缺失的列repetition是用于平均值的列。有没有更直接的方法?

标签: pandaspandas-groupby

解决方案


我在这里问了一个非常相似的问题:Use labels by which *not* to group in pandas groupby。不过,我的标签是一个分层索引。

我得到的答案是

df.groupby(df.index.droplevel('repetition')).mean()

哪个更好,但仍然不是很优雅。我通常使用

df.groupby(df.columns.difference(['repetition']).mean()

至少可以传达意图。

如果您找到解决此问题的好方法,请告诉我;)


推荐阅读