在Python中,我需要执行一个迭代groupby,它访问前面的“分组值”,以建立聚合列的行的值

z9gpfhce  于 2023-05-21  发布在  Python
关注(0)|答案(3)|浏览(148)

我有以下数据集,您可以使用此代码复制:

number_order = [2,2,3,3,5,5,5,6]
number_fakecouriers = [1,2,1,2,1,2,3,3]
dictio = {"number_order":number_order, "number_fakecouriers":number_fakecouriers}
actual_table = pd.DataFrame(dictio)

我需要写一段代码,通过for循环或groupby生成以下结果:

代码应该在列“number_orders”上执行groupby,然后取列“number_fakeorders”的最小值,但每次都应该迭代地排除列“number_fakeorders”中已经选择的最小值。然后,如果没有更多的可用值,则应输入“无”。
这是逐行的解释:

**1)“number_orders”= 2:**这里“number_fakeorders”的值是“1”,它只是“number_fakeorders”的最小值,其中[“number_orders”= 2],因为它是出现的第一个值
**2)“number_orders”= 3:**这里“number_fakeorders”的值是“2”,因为已经为[“number_orders”= 2]选择了“1”,所以排除“1”,其中[“number_orders”= 3]的最小值是“2”
**3)“number_orders”= 5:**这里“number_fakeorders”的值是“3”,因为“1”和“2”已经被选择了
**4)“number_orders”= 6:**这里“number_fakeorders”的值是“None”,因为[“number_orders”= 6]的“number_fakeorders”的唯一值是“3”,并且“3”已经被选择

kq0g1dla

kq0g1dla1#

尝试:

def fn(x, seen):
    for v in x:
        if v in seen:
            continue
        seen.add(v)
        return v

out = (
    actual_table.groupby("number_order")["number_fakecouriers"]
    .apply(fn, seen=set())
    .reset_index()
)
print(out)

图纸:

number_order  number_fakecouriers
0             2                  1.0
1             3                  2.0
2             5                  3.0
3             6                  NaN

注意:您可以在处理之前对 Dataframe 进行排序(如果尚未排序):

actual_table = actual_table.sort_values(
    by=["number_order", "number_fakecouriers"]
)

...
jc3wubiy

jc3wubiy2#

循环groupby对象并记录每组中的前一个最小值

res, prev_min = [], set()

for name, group in actual_table.groupby('number_order'):
    diff = set(group['number_fakecouriers']).difference(prev_min)
    if len(diff):
        m = min(diff)
        prev_min.add(m)
    else:
        m = np.nan

    res.append([name, m])

out = pd.DataFrame(res, columns=actual_table.columns)
print(out)

   number_order  number_fakecouriers
0             2                  1.0
1             3                  2.0
2             5                  3.0
3             6                  NaN
r55awzrz

r55awzrz3#

这里是另一个选项:

u = df['number_order'].unique()
d = {v:k for k,v in enumerate(u)}

(df.loc[df.sort_values('number_fakecouriers').groupby('number_order')['number_fakecouriers'].cumcount().le(df['number_order'].map(d))]
.drop_duplicates('number_fakecouriers')
.set_index('number_order')
.reindex(u)
.reset_index())

输出:

number_order  number_fakecouriers
0             2                  1.0
1             3                  2.0
2             5                  3.0
3             6                  NaN

相关问题