首页 > 解决方案 > 根据条件执行计算而不在 python 中指定列值

问题描述

我有一个 csv 文件,我需要在其中对列进行一些操作而不指定列值。

输入 csv(df) 如下:

weather speed   type    cal_A   cal_B
 good   0-3     cold    12       10
 good   0-3     cold    21       7
 good   0-3     cold    31       5
 good   0-3     cold    17       1
 good   3-5     cold    19       17
 bad    0-3     hot     15       4
 bad    6-9     hot     21       13
 bad    6-9     hot     15       7
 bad    6-9     cold    21       4
 rainy  0-3     cold    14       7
 rainy  5-8     cold    21       10
 rainy  5-8     cold    2        3
 rainy  5-8     cold    18       16

在这个 csv 中,我需要通过对列天气、类型和速度进行分组来划分名为 cal_A、cal_B 的列,然后找到最小值、最大值和平均值,并将它们作为单独的列。

列 cal_A 和 cal_B 相除后计算最小值、最大值和平均值。

输出文件如下:

weather speed   type    cal_A/cal_B(min)        cal_A/cal_B(max)    cal_A/cal_B(mean)
good    0-3     cold    1.2                        17
good    3-5     cold    1.11                       1.11
bad     0-3     hot     3.75                       3.75
bad     6-9     hot     1.61                       2.14
bad     6-9     cold    5.25                       5.25
rainy   0-3     cold    2                          2
rainy   5-8     cold    0.6                        2.1

我尝试过的代码如下:

df=df.groupby(['weather','speed','type'],as_index=False).min().eval('cal_A/cal_B(min)=cal_A/cal_B') df=df.groupby(['weather','speed','type'],as_index=False).max().eval('cal_A/cal_B(max)=cal_A/cal_B')

上面的代码将天气、速度和类型列分组,然后从计算中提供最小值和值,但这段代码没有为我提供预期的输出。

标签: python-3.xpandasgroup-bypandas-groupbyaggregation

解决方案


您将首先执行除法,然后对该系列进行分组和聚合。

(df.cal_A/df.cal_B).groupby([df.weather, df.speed, df.type], sort=False).agg(['min', 'max', 'mean'])

如果您想准确地重现您的输出,我们可以使用这些add_prefix/suffix方法(尽管重命名列对象可能更有效)。

((df.cal_A/df.cal_B).groupby([df.weather, df.speed, df.type], sort=False)
   .agg(['min', 'max', 'mean'])
   .add_prefix('cal_A/cal_B(')
   .add_suffix(')')
   .reset_index())

  weather speed  type  cal_A/cal_B(min)  cal_A/cal_B(max)  cal_A/cal_B(mean)
0    good   0-3  cold          1.200000         17.000000           6.850000
1    good   3-5  cold          1.117647          1.117647           1.117647
2     bad   0-3   hot          3.750000          3.750000           3.750000
3     bad   6-9   hot          1.615385          2.142857           1.879121
4     bad   6-9  cold          5.250000          5.250000           5.250000
5   rainy   0-3  cold          2.000000          2.000000           2.000000
6   rainy   5-8  cold          0.666667          2.100000           1.297222

推荐阅读