首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中执行基于条件的计算而不指定列值

在python中执行基于条件的计算而不指定列值
EN

Stack Overflow用户
提问于 2019-12-19 18:31:13
回答 2查看 125关注 0票数 0

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

输入csv(df)如下:

代码语言:javascript
运行
复制
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列除法后计算出来的。

输出文件如下:

代码语言:javascript
运行
复制
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')

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-19 18:37:54

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

代码语言:javascript
运行
复制
(df.cal_A/df.cal_B).groupby([df.weather, df.speed, df.type], sort=False).agg(['min', 'max', 'mean'])

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

代码语言:javascript
运行
复制
((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())

代码语言:javascript
运行
复制
  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
票数 3
EN

Stack Overflow用户

发布于 2019-12-19 18:42:40

如果与熊猫NamedAgg合作,您可以使用0.25+来解决这个问题:

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np 
data = {'weather':['good','good','good','good','good','bad','bad','bad','bad','rainy','rainy','rainy','rainy'],'speed':['0-3','0-3','0-3','0-3','3-5','0-3','6-9','6-9','6-9','0-3','5-8','5-8','5-8'],'type':['cold','cold','cold','cold','cold','hot','hot','hot','cold','cold','cold','cold','cold'],'cal_A':[12,21,31,17,19,15,21,15,21,14,21,2,18],'cal_B':[10,7,5,1,17,4,13,7,4,7,10,3,16]}
df = pd.DataFrame(data)
df['divided'] = df['cal_A']/df['cal_B']
output = df.groupby(['weather','speed','type']).agg(
    minimum=pd.NamedAgg(column='divided',aggfunc='min'),
    maximum=pd.NamedAgg(column='divided',aggfunc='max'),
    mean=pd.NamedAgg(column='divided',aggfunc='mean'))
print(output)

产出:

代码语言:javascript
运行
复制
                     minimum    maximum      mean
weather speed type
bad     0-3   hot   3.750000   3.750000  3.750000
        6-9   cold  5.250000   5.250000  5.250000
              hot   1.615385   2.142857  1.879121
good    0-3   cold  1.200000  17.000000  6.850000
        3-5   cold  1.117647   1.117647  1.117647
rainy   0-3   cold  2.000000   2.000000  2.000000
        5-8   cold  0.666667   2.100000  1.297222
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59415175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档