python - 如何在大型数据集上对大量熊猫数据框选择调用进行多线程处理
问题描述
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
解决方案
你可以尝试一个矢量化版本,如果你有很多类,它可能会加快速度。
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.
请注意,如果存在重复索引,这可能会失败。
推荐阅读
- javascript - JavaScript `降低`性能
- .net - Visual Studio 2015,OneDrive - aspx.vb 页面需要从 OneDrive 访问文件
- c# - 使用 MSTest 作为测试框架时是否可以使测试方法通用?
- regex - 正则表达式搜索包含其他短语的短语并且不标记其他任何内容
- reactjs - 如何在 React 中渲染递归组件?
- debian - debuild - 依赖集但没有版本
- java - 更新 SQLite 数据库 Android RecyclerView 迭代
- javascript - Javascript递归回溯数独求解器
- php - 当 $stmt->execute() 使我的 apache 服务器崩溃时,如何输出 MySQLi $stmt?
- r - 决定 scale_y_continuous 比例因子的密度函数 ggplot2