Python 如何按组计算两列值的比率?

Python 如何按组计算两列值的比率?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个航班列表作为熊猫数据框,如下所示: airline status number ... Aer Lingus some error A 14 ... Aeroflot success 47 ... Air Canada success 2 ... Air Dolomiti success 2 ... Ai

我有一个航班列表作为熊猫数据框,如下所示:

airline        status          number    ...

Aer Lingus     some error A        14    ...
Aeroflot       success             47    ...
Air Canada     success              2    ...
Air Dolomiti   success              2    ...
Air Europa     some error B         4    ...
Air France     success             40    ...
Alitalia       some error A        10    ...
....
airline        success_ratio

Aer Lingus     0.72
Aeroflot       0.845
Air Canada     0.935
Air Dolomiti   0.5
Air Europa     ...
....
我为每一次成功或出错的飞行调用一些api

我想要的是每家航空公司的成功率。因此,我知道我可以使用groupby计算列“airline”和“status”中出现的值,但我无法计算值的比率

def calculate_quote_success_ratios(flights):

    success_ratio_per_airline = flights.groupby(['airline', 'status']).count()
    # TODO: Include ratio with failures!

    return success_ratio_per_airline
预期输出应如下所示:

airline        status          number    ...

Aer Lingus     some error A        14    ...
Aeroflot       success             47    ...
Air Canada     success              2    ...
Air Dolomiti   success              2    ...
Air Europa     some error B         4    ...
Air France     success             40    ...
Alitalia       some error A        10    ...
....
airline        success_ratio

Aer Lingus     0.72
Aeroflot       0.845
Air Canada     0.935
Air Dolomiti   0.5
Air Europa     ...
....

编辑:为了清楚起见,
df['numbers']
列不相关。因此,我只想计算每个航空公司的“成功”与各种错误的百分比

我必须修改您的示例才能使其工作,但您只需执行
df.groupby(['airline','status']).sum()/df.groupby(['airline']).sum()

原始df:

airline           status    number
0   Aer Lingus  some error A    14
1   Aeroflot    success 47
2   Air Canada  success 2
3   Air Dolomiti    success 2
4   Air Europa  some error B    4
5   Air France  success 40
6   Alitalia    some error A    10
7   Alitalia    success 10
8   Air France  some error B    10
9   Aer Lingus  success 12



df.groupby(['airline', 'status']).sum() / df.groupby(['airline']).sum()

                                  number
airline         status  
Aer Lingus     some error A     0.538462
               success          0.461538
Aeroflot       success          1.000000
Air Canada      success         1.000000
Air Dolomiti    success         1.000000
Air Europa    some error B      1.000000
Air France    some error B      0.200000
              success           0.800000
Alitalia      some error A      0.500000
              success           0.500000

我不得不修改您的示例以使其工作,但您只需执行
df.groupby(['airline','status']).sum()/df.groupby(['airline']).sum()

原始df:

airline           status    number
0   Aer Lingus  some error A    14
1   Aeroflot    success 47
2   Air Canada  success 2
3   Air Dolomiti    success 2
4   Air Europa  some error B    4
5   Air France  success 40
6   Alitalia    some error A    10
7   Alitalia    success 10
8   Air France  some error B    10
9   Aer Lingus  success 12



df.groupby(['airline', 'status']).sum() / df.groupby(['airline']).sum()

                                  number
airline         status  
Aer Lingus     some error A     0.538462
               success          0.461538
Aeroflot       success          1.000000
Air Canada      success         1.000000
Air Dolomiti    success         1.000000
Air Europa    some error B      1.000000
Air France    some error B      0.200000
              success           0.800000
Alitalia      some error A      0.500000
              success           0.500000
您可以与
normalize='index'
一起使用:

# data from @Chris

res = pd.crosstab(df['airline'], df['status'], values=df['number'],
                  aggfunc='count', normalize='index')

print(res[['success']])

status       success
airline             
AerLingus        0.5
Aeroflot         1.0
AirCanada        1.0
AirDolomiti      1.0
AirEuropa        0.0
AirFrance        0.5
Alitalia         0.5
您可以与
normalize='index'
一起使用:

# data from @Chris

res = pd.crosstab(df['airline'], df['status'], values=df['number'],
                  aggfunc='count', normalize='index')

print(res[['success']])

status       success
airline             
AerLingus        0.5
Aeroflot         1.0
AirCanada        1.0
AirDolomiti      1.0
AirEuropa        0.0
AirFrance        0.5
Alitalia         0.5

按组计算航班数

count_flight=df.groupby('airline').status.count()

按组计算成功次数

count_success=df[df['status']=='success'].groupby('airline').status.count()
pandas div返回前两个数据帧的分组比率

count_success.div(count_flight).fillna(0)

按组计算航班数

count_flight=df.groupby('airline').status.count()

按组计算成功次数

count_success=df[df['status']=='success'].groupby('airline').status.count()
pandas div返回前两个数据帧的分组比率

count_success.div(count_flight).fillna(0)

对你来说,这会有用的

我正在对正确的有标记的答案做一个小改动

res=pd.交叉表(df['airline'],df['status'],值=”, aggfunc='count',normalize='index')


打印(res[['success']])

对您来说,这将起作用

我正在对正确的有标记的答案做一个小改动

res=pd.交叉表(df['airline'],df['status'],值=”, aggfunc='count',normalize='index')



打印(res['success']])

这对我不起作用。也许我有点不清楚。“数字”列不相关。因此,我只想计算每个航空公司的“成功”与各种错误的百分比。你的代码看起来很有前途,我认为是这样,但它似乎不适合我。。。谢谢你@尽管我很抱歉;我认为
number
列是每个事件发生的次数status@Ipsider如果您只关心每个状态的出现次数,那么您可以做同样的事情,但不必使用
.sum()
而是使用
.count()
知道了。很抱歉,这个令人困惑的例子!这对我不起作用。也许我有点不清楚。“数字”列不相关。因此,我只想计算每个航空公司的“成功”与各种错误的百分比。你的代码看起来很有前途,我认为是这样,但它似乎不适合我。。。谢谢你@尽管我很抱歉;我认为
number
列是每个事件发生的次数status@Ipsider如果您只关心每个状态的出现次数,那么您可以做同样的事情,但不必使用
.sum()
而是使用
.count()
知道了。很抱歉,这个令人困惑的例子!对不起,我想我不太清楚。我想计算发生的比率,所以我的数据帧中的列“number”不相关。例如,如果航空公司A有5次成功,5次失败,我想排一行:“航空公司A,0.5”好的,谢谢。“值”参数用于什么?我很困惑,因为数字列不相关
aggfunc='count'
需要一些东西来计算,我们只是计算
df['number']
中非
NaN
值的数量。
df['number']
中的数字没有使用/相关。谢谢,你知道我如何将发生的总数添加到每个航空公司吗?@Ipsider,
crosstab
只支持一个
aggfunc
。如果你有其他要求,你可以。对不起,我想我不太清楚。我想计算发生率,因此数据框中的“number”列不相关。例如,如果航空公司A有5次成功,5次失败,我想排一行:“航空公司A,0.5”好的,谢谢。“值”参数用于什么?我很困惑,因为数字列不相关
aggfunc='count'
需要一些东西来计算,我们只是计算
df['number']
中非
NaN
值的数量。
df['number']
中的数字没有使用/相关。谢谢,你知道我如何将发生的总数添加到每个航空公司吗?@Ipsider,
crosstab
只支持一个
aggfunc
。如果您有其他要求,您可以。请对您的代码进行解释以提高回答的质量请对您的代码进行解释以提高回答的质量您应该清楚地解释您为什么建议此更改以及它增加了什么好处。您应该清楚地解释您为什么这样做提出这一变化及其带来的好处。