首页 > 解决方案 > 如何在大型数据集上对大量熊猫数据框选择调用进行多线程处理

问题描述

df 是一个包含 1200 万多行未排序的数据框。每行都有一个 GROUP ID。

最终目标是为每个唯一的 GROUP ID 随机选择 1 行,从而填充一个名为 SELECTED 的新列,其中 1 表示已选择 0 表示相反

可能有 5000 多个唯一的 GROUP ID。寻求比以下潜在多线程解决方案更好更快的解决方案?

for sec in df['GROUP'].unique():
    sz = df.loc[df.GROUP == sec, ['SELECTED']].size
    sel = [0]*sz
    sel[random.randint(0,sz-1)] = 1
    df.loc[df.GROUP == sec, ['SELECTED']] = sel

标签: pythonpandasnumpy

解决方案


你可以尝试一个矢量化版本,如果你有很多类,它可能会加快速度。

import pandas as pd

# get fake data
df = pd.DataFrame(pd.np.random.rand(10))
df['GROUP'] = df[0].astype(str).str[2]

# mark one element of each group as selected
df['selected'] = df.index.isin(    # Is current index in a selected list?
        df.groupby('GROUP')        # Get a GroupBy object.
        .apply(pd.Series.sample)   # Select one row from each group.
        .index.levels[1]           # Access index - in this case (group, old_id) pair; select the old_id out of the two.
        ).astype(pd.np.int) # Convert to ints.

请注意,如果存在重复索引,这可能会失败。


推荐阅读