python - 使用排序列有效地从 Pandas 数据框中选择行

标签 python python-3.x pandas

我有一个大型 pandas 数据框,其中包含多列 (c1 ... c8) 和约 3200 万行。数据框已按 c1 排序。我想从共享特定 c1 值的行中获取其他列值。

有点像

keys = big_df['c1'].unique()
red = np.zeros(len(keys))
for i, key in enumerate(keys):
    inds = (big_df['c1'] == key)
    v1 = np.array(big_df.loc[inds]['c2'])
    v2 = np.array(big_df.loc[inds]['c6'])
    red[i] = reduce_fun(v1,v2)

然而,我认为这非常慢,因为它会检查整个列的匹配标准(即使 3200 万行中可能只有 10 行是相关的)。由于 big_df 按 c1 排序并且键只是所有唯一 c1 的列表,是否有快速获取 red[] 数组的方法(即我知 Prop 有下一个键的第一行是最后一行之后的行previous key,我知道一个键的最后一行是与该键匹配的最后一行,因为所有后续行都保证不匹配)。

谢谢,

伊利亚

编辑:我不确定 unique() 方法产生的顺序是什么,但我基本上想为键中的每个键设置一个 reduce_fun() 值,我并不特别关心它们的顺序(大概是最简单的顺序)是 c1 已经排序的顺序)。

Edit2:我稍微重组了代码。基本上,是否有构建 inds 的有效方法。 big_df['c1'] == key 在我的数据中占用了总时间的 75.8%,根据 line profiler,在创建 v1 时,v2 占用了 21.6%。

最佳答案

我没有使用列表,而是选择了一个字典来保存 c1 中每个项目的缩减值。

red = {key: reduce_func(frame['c2'].values, frame['c7'].values) 
       for key, frame in df.groupby('c1')}

关于python - 使用排序列有效地从 Pandas 数据框中选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45558164/

相关文章:

python - 如何将计数附加到 Python 列表中的重复项?

python - 狮身人面像添加背景图像

python - 是否可以使用 pymysql 插入字典?

python - 无法在基于 asyncio 构建的脚本中使用 https 代理以及重用同一 session

python - 从张量中提取多个子矩阵

python - 在 pandas dataframe 上应用 ML 库是个好主意吗?

python - 我如何进行分组并查看该组的所有成员是否都满足特定条件?

python - 给定扁平列表中的索引,获取原始列表项的索引

python - 删除 json 输出中具有空值的列

python - 在python中分组交易描述和计数