Python:从一个子组提取最小值,从另一个子组提取最大值

Python:从一个子组提取最小值,从另一个子组提取最大值,python,Python,我有一个标记为“关键”的主组,一个标记为“国家”的子组和一个“成本”值。对于每个主要组“键”,我首先要提取最小成本,然后在其他子组中获取最大“成本”,即,从剩余国家/地区获取最大“成本”,忽略获取最小值的国家/地区的所有条目(最大成本必须是单个值,而不是剩余国家/地区的最大成本) 我的数据看起来像 key COUNTRY COST X1 A1 1.2 X1 A1 1.5 X1 A2

我有一个标记为“关键”的主组,一个标记为“国家”的子组和一个“成本”值。对于每个主要组“键”,我首先要提取最小成本,然后在其他子组中获取最大“成本”,即,从剩余国家/地区获取最大“成本”,忽略获取最小值的国家/地区的所有条目(最大成本必须是单个值,而不是剩余国家/地区的最大成本)

我的数据看起来像

key     COUNTRY       COST  
X1      A1             1.2  
X1      A1             1.5  
X1      A2             0.8  
X1      A2             0.9  
X1      A3             2.1  
X1      A3             0.7  
X1      A3             1.9  
X2      A1             0.4  
X2      A3             2.2  
X2      A3             1.0  
我的代码是“for循环”,效率不高。请建议一种更好的方法。下面是我的代码

df_out = pd.DataFrame()

grouping = list(data.groupby('key',as_index=False).groups.keys())

for group in grouping:

    df_group = data[data['key']==group]
    country_count = df_group.COUNTRY.nunique()

    if country_count > 1:
        group_min_cost = df_group.loc[df_group['COST'].idxmin()]

        drop_index = df_group[df_group['COUNTRY'] == group_min_cost.COUNTRY].index
        df_group = df_group.drop(drop_index)

        group_max_cost = df_group.loc[df_group['COST'].idxmax()]

        summary = {'key': group,
                   'Country_Min': group_min_cost.COUNTRY,
                   'Country_Max': group_max_cost.COUNTRY,
                   'Cost_Min': group_min_cost.COST,
                   'Cost_Max': group_max_cost.COST}

        df_out = df_out.append(summary, ignore_index=True)
我正在寻找的输出是

key    Country_Min    Cost_Min  Country_Max    Cost_Max  
X1      A3             0.7       A1             1.5   
X2      A1             0.4       A3             2.2  

您肯定不想在这种类型的操作中使用循环。有几种方法可以避免行级循环。这里有一个:

countries = pd.unique(df['COUNTRY'])

for country in countries:
    idx = df['COUNTRY'] == country
    min_cost = min(df.loc[idx, 'COST'])
    max_cost = max(df.loc[idx, 'COST'])
    print('min/max cost for {0}: {1}, {2}'.format(country, min_cost, max_cost))
min/max cost for A1: 0.4, 1.5
min/max cost for A2: 0.8, 0.9
min/max cost for A3: 0.7, 2.2
更简单的是使用聚合函数,该函数返回具有最小成本值的数据帧:

projection = {'COST': ['min', 'max']}

df_min_cost = df.groupby(by='COUNTRY').agg(projection)

df_min_cost
返回:

    COST
min max
COUNTRY     
A1  0.4 1.5
A2  0.8 0.9
A3  0.7 2.2

对于问题的前半部分,您可以使用以下结构:

data.iloc[data.groupby(['key'])['cost'].idxmin().values]

其中,
data
是您的数据帧,但仍然不知道如何在没有循环的情况下使用此数据帧进行掩码