python在分组数据帧时跨多个列获取最大值和最小值

python在分组数据帧时跨多个列获取最大值和最小值,python,pandas,aggregation,Python,Pandas,Aggregation,此查询与和相关 我试图从分组数据中的两列创建最小值和最大值 我有一个这样的数据集 measure measure_group route year actual budget AC electrification A 20182019 103 99 AC electrification A 20192020 110 122 AC

此查询与和相关

我试图从分组数据中的两列创建最小值和最大值

我有一个这样的数据集

measure     measure_group     route     year      actual     budget
AC          electrification   A         20182019  103        99
AC          electrification   A         20192020  110        122
AC          electrification   B         20182019  9          10
AC          electrification   B         20192020  55         50
HV          electrification   A         20182019  2          10
HV          electrification   A         20192020  7          15
HV          electrification   B         20182019  67         10
HV          electrification   B         20192020  100        115
cat 1       track             A         20182019  10         15
cat 1       track             A         20192020  111        25
cat 1       track             B         20182019  55         16
cat 1       track             B         20192020  75         175
cat 2       track             A         20182019  84         5
cat 2       track             A         20192020  125        1005
cat 2       track             B         20182019  7          4
cat 2       track             B         20192020  15         25        
我想要的是每种度量、度量单位组、路线等组合的[实际、预算]的最小值和最大值作为新列

measure     measure_group     route     year      actual     budget  min  max
AC          electrification   A         20182019  103        99      99   122
AC          electrification   A         20192020  110        122     99   122
AC          electrification   B         20182019  9          10      9    55
AC          electrification   B         20192020  55         50      9    55
HV          electrification   A         20182019  2          10      2    15
HV          electrification   A         20192020  7          15      2    15
HV          electrification   B         20182019  67         10      10   115
HV          electrification   B         20192020  100        115     10   115
cat 1       track             A         20182019  10         15      10   111
cat 1       track             A         20192020  111        25      10   111
cat 1       track             B         20182019  55         16      16   175
cat 1       track             B         20192020  75         175     16   175
cat 2       track             A         20182019  84         5       5    1005
cat 2       track             A         20192020  125        1005    5    1005
cat 2       track             B         20182019  7          4       4    25
cat 2       track             B         20192020  15         25      4    25
我尝试了df.groupby
df_remaped['min']=df_remaped.groupby(['Measure','Measure_group','route'])[['Actual','Budget']]]的各种组合。transform('min')
,但这会返回一个值错误:
传递的项数错误2,placement暗示1
我有一种感觉,我试图将两列返回到一个新列中

我确实考虑过生成一个独立的数据文件,然后使用普通索引上的连接重新加入到原来的数据文件中,但是这感觉像是冗长的处理……/P>


如能提供任何可能的方法,我们将不胜感激。奇怪的是,聚合的大多数例子只针对单列。

您可以<代码>熔体数据框,以便在计算MIN或Max时考虑“实际”或“预算”。然后将熔化的数据框分组并合并。

id_vars = ['measure', 'measure_group', 'route']

df1 = (df.melt(id_vars=id_vars, value_vars=['actual', 'budget'])
         .groupby(id_vars)['value']
         .agg(['min', 'max']))

df = df.merge(df1, how='left', on=id_vars)


transform
在这里是可能的,但它确实适合于单个列的单个聚合。在这里,您需要跨多个列进行聚合,并且需要两个聚合(最小值、最大值),因此这会变得非常麻烦。它可以用transform来完成,但它不是这个工作的合适工具。我喜欢使用链式赋值使代码更紧凑,同时保持可读性。非常感谢
   measure    measure_group route      year  actual  budget  min   max
0       AC  electrification     A  20182019     103      99   99   122
1       AC  electrification     A  20192020     110     122   99   122
2       AC  electrification     B  20182019       9      10    9    55
3       AC  electrification     B  20192020      55      50    9    55
4       HV  electrification     A  20182019       2      10    2    15
5       HV  electrification     A  20192020       7      15    2    15
6       HV  electrification     B  20182019      67      10   10   115
7       HV  electrification     B  20192020     100     115   10   115
8     cat1            track     A  20182019      10      15   10   111
9     cat1            track     A  20192020     111      25   10   111
10    cat1            track     B  20182019      55      16   16   175
11    cat1            track     B  20192020      75     175   16   175
12    cat2            track     A  20182019      84       5    5  1005
13    cat2            track     A  20192020     125    1005    5  1005
14    cat2            track     B  20182019       7       4    4    25
15    cat2            track     B  20192020      15      25    4    25