python-3.x - 根据条件执行计算而不在 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')
上面的代码将天气、速度和类型列分组,然后从计算中提供最小值和值,但这段代码没有为我提供预期的输出。
解决方案
您将首先执行除法,然后对该系列进行分组和聚合。
(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
推荐阅读
- php - 使用 txt 文件(包含字符串的大列表)搜索字谜
- matlab - 多元隐马尔可夫模型实现问题
- c# - Parallel.Foreach 是否可以安全地将值分配给目标列表项?
- r - gglpot中的2点图
- arrays - 如何对数组进行反向排序,排序从行尾开始
- php - 在 Domain.com 提供的共享主机上安装 Laravel 项目
- css - 删除 display:flex 会在链接周围添加空格。为什么?
- javascript - 使用 JavaScript 更改链接颜色属性
- raku - 在 Perl 6 中捕获 shell 命令的异常
- c - 使用 Map Reduce 的 POSIX 线程