我有一个Pandas Dataframe ,它是一个小 Dataframe 的(大量的)重复,但是只有一列是不重复的。我想应用一个函数,这个函数可以作用于这个不重复的列和其中一个重复的列。但是整个过程很慢,我需要一个替代的方法来更快地工作。下面是一个最小的例子:
import pandas as pd
import numpy as np
import random
repeating_times = 4
df = pd.DataFrame({"col1": [1, 2, 3, 4, 5]*repeating_times,
"col2": ['a', 'b', 'c', 'd', 'e']*repeating_times,
"true": ['P', 'P', 'N', 'P', 'N']*repeating_times,
"pred": random.choices(["P", "N"], k=5*repeating_times)})
grps = df.groupby(by=["col1", "col2"])
true_pos = grps.apply(lambda gr: np.sum(gr[gr['pred'] == 'P']["true"] == 'P'))
true_pos
true_pos
测量(col1,col2)的所有组的真阳性样本(其中预测值和真值为正类)。
**更新:**一个更好的方法是使用agg
而不是应用函数。
repeating_times = 4
df = pd.DataFrame({"col1": [1, 2, 3, 4, 5]*repeating_times,
"col2": ['a', 'b', 'c', 'd', 'e']*repeating_times,
"true": ['P', 'P', 'N', 'P', 'N']*repeating_times,
"pred": random.choices(["P", "N"], k=5*repeating_times)})
df["true_pos"] = (df["true"]=="P") & (df["pred"]=="P")
true_pos = df.groupby(["col1", "col2"]).agg({"true_pos": "sum"})
1条答案
按热度按时间py49o6xq1#
在这些情况下,您可以从另一个Angular 进行处理:首先计算内部条件,即,“真”和“预测”都是“P”,然后通过col_1和col_2对 that 分组,并求和:
这是被分组的东西:
然后,.groupby将查看唯一的col1和col2对对应到其中的位置,并对它们中的每一个求和。