假设我有一个数据框
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
有更快的计算方法吗?
答案 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)
。获取transform
和sum
count
答案 1 :(得分:0)
首先通过形成计数表和每个索引的总和来合并数据(如果索引是连续的或密集的,则使用数组;否则使用字典)。
创建表格后(约O(M)
个不同索引的M
次操作),累积的单次传递将需要O(N)
次添加。
然后计算总和和总数(O(M)
加法)。
最后,对于每个索引,扣除相应的每索引总和和平均值。
总费用与O(N + M)
类似,可在初始解决方案中与O(N²)
进行比较。
如果这些组足够大,这种方法将是值得的。