![](/img/trans.png)
[英]What is the fastest way to update a Dataframe when complex conditions exist for both selection and update?
[英]The fastest way to update (partial sum of elements with complex conditions) the pandas dataframe
我尝试更新具有300万行的pandas数据框。 在下面,我将问题简化为一个更简单的问题。 简而言之,它确实在累积意义上增加了价值。
但是,对于我来说,此功能花费的时间太长,例如10个小时以上。 有提速的空间吗? 我应该只在最后更新吗?
我们能否以比iterrows()更快的方式更新熊猫数据框?
我们可以通过其索引选择多个行然后进行更新吗?
def set_r(group, i, colname, add):
if colname in group:
prev = group.iloc[i][colname]
if math.isnan(prev):
group.set_value(i, colname, add)
else:
group.set_value(i, colname, prev+add)
else:
group.set_value(i, colname, add)
def set_bl_info(group, i, r, bl_value, timeframe, clorca, bl_criteria):
group.set_value(i, timeframe + '_' + bl_criteria, True)
colname = timeframe + '_' + clorca + '_' + 'bb_count_'+ bl_criteria
set_r(group, i, colname, 1)
def bl_assign(days, bl_key, bl_value, group, bl_p05, bl_p01):
print bl_key
sub_group = group[(group.pledged_date >= bl_value[0]) & (group.pledged_date <= bl_value[1])]
coexisting_icl = sub_group[(sub_group.project_category == bl_value[2]) & (sub_group.cluster == bl_value[3])]
for i, r in coexisting_icl.iterrows():
set_bl_info(group, i, r, bl_value, 'coexisting', 'icl','p1')
# main function
bl_assign(days, bl_key, bl_value, group, bl_p05, bl_p01)
为了更简单,我的问题如下所示:
A B C
0 0 0 False
1 7 0 True
2 8 0 True
3 5 0 True
如果C为真且更新A列的元素,则更新B列
A B C
0 0 0 False
1 7 20 True
2 8 20 True
3 5 20 True
此后,如果D也为true,则用E的总和更新B
A B C D E
0 0 0 False False 1
1 7 20 True False 1
2 8 20 True True 1
3 5 20 True True 1
A B C D E
0 0 0 False False 1
1 7 20 True False 1
2 8 22 True True 1
3 5 22 True True 1
如果C为真且更新A列的元素,则更新B列
import numpy as np
df['B'] = np.where(df.C, df.A.sum(), 0)
之后,如果D也是tru,则用E的总和更新B(使用上面问题的注释)
df.B = df.B + np.where(df.D, (df.E * df.D.astype(int)).sum(), 0)
所以,最后你有
>>> df
A C B E D
0 0 False 0 1 False
1 7 True 20 1 False
2 8 True 22 1 True
3 5 True 22 1 True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.