给定数据框df:
Column A: [0, 1, 3, 4, 6]
Column B: [0, 0, 0, 0, 0]
目标是有条件地替换B列中的值。如果列A的值存在于集合assginedToA
中,我们会将列B中的相应值替换为常量b
。
例如:如果 b = 1且 assignedToA = {1,4},结果将是是
Column A: [0, 1, 3, 4, 6]
Column B: [0, 1, 0, 1, 0]
我找到A值并将B值写入其中的代码如下所示:
df.loc[df['A'].isin(assignedToA),'B']=b
此代码可以正常运行,但对于庞大的数据帧来说,它确实很慢。 您有什么建议,如何加快这一过程?
数据框df有大约5百万行,assignedToA
最多有7个值。
答案 0 :(得分:2)
您可以通过下降到numpy
来找到性能提升:
df = pd.DataFrame({'A': [0, 1, 3, 4, 6],
'B': [0, 0, 0, 0, 0]})
def jp(df, vals, k):
B = df['B'].values
B[np.in1d(df['A'], list(vals))] = k
df['B'] = B
return df
def original(df, vals, k):
df.loc[df['A'].isin(vals),'B'] = k
return df
df = pd.concat([df]*100000)
%timeit jp(df, {1, 4}, 1) # 8.55ms
%timeit original(df, {1, 4}, 1) # 16.6ms