Python:在大型数据框中按值选择行

时间:2018-06-05 12:06:54

标签: python performance pandas dataframe

给定数据框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个值。

1 个答案:

答案 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