保留一个元素的快速计算均值

时间:2017-02-08 10:29:37

标签: python pandas dataframe mean

假设我有一个数据框

df = pd.DataFrame(data={'group_id': [1, 1, 1, 1, 2, 2, 2, 2], 
    'A': [24.0, 12.0, 23.0, 22.0, 44.0, 55.0, 52.0, 48.0],
    'B': [23.0, 15.0, 22.0, 21.0, 65.0, 53.0, 53.0, 54.0]})

对于数据帧中的每个索引,我想计算组的平均值(由组ID指定),而不包括此索引。

我开始使用两个for循环并使用apply提高速度:

def func(x):
    df = x.copy()
    for row in x.itertuples():
        df.loc[row[0], :] = x.loc[x.index != row[0], :].mean()

    return df

df.groupby('group_id')['A', 'B'].apply(func)

所需的输出是

                    A          B
group_id                        
1        0  19.000000  19.333333
         1  23.000000  22.000000
         2  19.333333  19.666667
         3  19.666667  20.000000
2        4  51.666667  53.333333
         5  48.000000  57.333333
         6  49.000000  57.333333
         7  50.333333  57.000000

有更快的计算方法吗?

2 个答案:

答案 0 :(得分:2)

使用class QuestionOption(Model): option = ForeingKeyField(Option) question = ForeignKeyField(Question) selected = BooleanField(default=False) def clean_selected(self): # make sure only one option per question is selected class Question(Model): quiz_question = TextField(null=False, blank=False) answer = TextField() options = ManyToManyField(Option, through=QuestionOption) 。获取transformsum

count

答案 1 :(得分:0)

首先通过形成计数表和每个索引的总和来合并数据(如果索引是连续的或密集的,则使用数组;否则使用字典)。

创建表格后(约O(M)个不同索引的M次操作),累积的单次传递将需要O(N)次添加。

然后计算总和和总数(O(M)加法)。

最后,对于每个索引,扣除相应的每索引总和和平均值。

总费用与O(N + M)类似,可在初始解决方案中与O(N²)进行比较。

如果这些组足够大,这种方法将是值得的。

相关问题