优化 Pandas Dataframe 的 min-max 和 groupby 查询

qwerty

我有一个如下所示的输入数据框:

  col0  col1 name
0   g0   100   n1
1   g0   120   n1
2   g1    40   n3
3   g1    30   n4
4   g2    10   n5
5   g2   100   n5
6   g2   250   n5

我想获得一个新的数据框(或相同的,没关系),其中col1col2分别包含每个 tuple 的最小值和最大值(col0, name)我可以使用以下代码段执行此操作:

import pandas as pd
data = {'col0': ["g0", "g0", "g1", "g1", "g2", "g2", "g2"], 'col1': [100, 120, 40, 30, 10, 100, 250], 'name': ["n1", "n1", "n3", "n4", "n5", "n5", "n5"]}
df = pd.DataFrame(data=data)

df_res = pd.DataFrame()

names = df["name"].unique()

for name in names:
    literals = df[df["name"] == name]["col0"].unique()

    for literal in literals:
        min_val = df[(df["name"] == name) &
                     (df["col0"] == literal)]["col1"].min()
        max_val = df[(df["name"] == name) &
                     (df["col0"] == literal)]["col1"].min()

        elem = {"col0": literal, "col1": min_val, "col2": max_val,
                "name": name}

        df_res = df_res.append(elem, ignore_index=True)

这给出了存储在 上的所需输出df_res,如下所示:

  col0   col1   col2 name
0   g0  100.0  100.0   n1
1   g1   40.0   40.0   n3
2   g1   30.0   30.0   n4
3   g2   10.0   10.0   n5

问题是我必须使用具有 95K 寄存器的数据帧进行这种转换,而且我的方法非常慢(需要几分钟才能完成)。

因此,我的问题是:有没有办法优化这个操作?

寡妇

您可以使用groupby.agg并传递minmax获取所需的列。要将自定义名称设置为聚合列,您可以使用命名聚合来命名 min 列col1和 max 列col2

out = df.groupby(['col0','name'], as_index=False).agg(col1=('col1','min'), col2=('col1','max'))

以另一种方式相同的代码:

out = df.groupby(['col0','name'])['col1'].agg(['min','max']).set_axis(['col1','col2'], axis=1).reset_index()

输出:

  col0 name  col1  col2
0   g0   n1   100   120
1   g1   n3    40    40
2   g1   n4    30    30
3   g2   n5    10   250

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章