拥有数据帧

import pandas as pd

df = pd.DataFrame(
    {
        "group0": [1, 1, 2, 2, 3, 3],
        "group1": ["1", "1", "1", "2", "2", "2"],
        "relevant": [True, False, False, True, True, True],
        "value": [0, 1, 2, 3, 4, 5],
    }
)

我希望制造一个目标

target = pd.DataFrame(
    {
        "group0": [1, 2, 2, 3],
        "group1": ["1","1", "2", "2",],
        "value": [0, 2, 3, 5],
    }
)

其中"value"人被评为

  1. "value"列中所有正"relevant"指数中的最大值
  2. 如果不存在正"relevant"指数,则最大值为"value"

这将由以下人员生产

def fun(x):
    tmp = x["value"][x["relevant"]]
    if len(tmp):
        return tmp.max()
    return x["value"].max()

x个分组数据帧.

是否有可能有效地实现所需的分组减少?

编辑:

使用有效载荷

from time import perf_counter()
df = pd.DataFrame(
    {
        "group0": np.random.randint(0, 30,size=10_000_000),
        "group1": np.random.randint(0, 30,size=10_000_000),
        "relevant": np.random.randint(0, 1, size=10_000_000).astype(bool),
        "value": np.random.random_sample(size=10_000_000) * 1000,
    }
)

start = perf_counter()
out = (df
   .sort_values(by=['relevant', 'value'])
   .groupby(['group0', 'group1'], as_index=False)
   ['value'].last()
 )
end = perf_counter()
print("Sort values", end - start)

def fun(x):
    tmp = x["value"][x["relevant"]]
    if len(tmp):
        return tmp.max()
    return x["value"].max()

start = perf_counter()
out = df.groupby(["group0", "group1"]).apply(fun)
end = perf_counter()
print("Apply", end - start)
#Sort values 14.823943354000221
#Apply 1.5050544870009617

.apply-溶液时间为1.5s.sort_values的解决方案以14.82s执行.然而,通过以下方式缩小测试组的规模

...
        "group0": np.random.randint(0, 500_000,size=10_000_000),
        "group1": np.random.randint(0, 100_000,size=10_000_000),
...

通过sort_values解决方案带来了极高的性能. (15.29分对1423.84分).除非用户明确知道数据包含较小的组计数,否则最好使用sort_values@mozway的解决方案.

推荐答案

将值排序,将True放在最后,然后是最高数字,并使用groupby.last:

out = (df
   .sort_values(by=['relevant', 'value'])
   .groupby(['group0', 'group1'], as_index=False)
   ['value'].last()
 )

输出:

   group0 group1  value
0       1      1      0
1       2      1      2
2       2      2      3
3       3      2      5

聚合前的中间:

*所选行

   group0 group1  relevant  value
1       1      1     False      1
2       2      1     False      2  *
0       1      1      True      0  *
3       2      2      True      3  *
4       3      2      True      4
5       3      2      True      5  *

Python相关问答推荐

使用图片生成PDF Django rest框架

在Python和matlab中显示不同 colored颜色 的图像

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

通过优化空间在Python中的饼图中添加标签

'discord.ext. commanders.cog没有属性监听器'

如何根据参数推断对象的返回类型?

未删除映射表的行

查找两极rame中组之间的所有差异

对象的`__call__`方法的setattr在Python中不起作用'

让函数调用方程

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

Geopandas未返回正确的缓冲区(单位:米)

在Python中使用yaml渲染(多行字符串)

如何找出Pandas 图中的连续空值(NaN)?

为什么调用函数的值和次数不同,递归在代码中是如何工作的?

并行编程:同步进程

用两个字符串构建回文

Tensorflow tokenizer问题.num_words到底做了什么?

数据框,如果值在范围内,则获取范围和

按条件添加小计列