拥有数据帧
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"
人被评为
-
"value"
列中所有正"relevant"
指数中的最大值 - 如果不存在正
"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的解决方案.