python - Python:从一个子组中提取最小值,从另一个子组中提取最大值
问题描述
我有一个标记为“关键”的主要组,标记为“国家”的子组和一个“成本”值。对于每个主要组“密钥”,我首先要提取最小成本,然后在其他子组中获取最大“成本”,即从其余国家/地区中获取最大“成本”,忽略该国家/地区的所有条目取最小值(最大成本必须是一个单一值,而不是其余每个国家/地区的最大成本)。
我的数据看起来像
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-loop”,效率不高。请提出一个更好的方法来做到这一点。下面是我的代码。
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
推荐阅读
- python - 按列条件过滤长格式df
- scala - 如何调用包装在 TaskKey 中的函数?
- nativescript - Nativescript-vue:如何使自定义组件可点击?
- android - 膨胀类 android.webkit.WebView 时出错
- scrapy - 当 auto_ack=False 时 RabbitMQ ack 超时错误
- android - 我的 PWA 仅在 Chrome for Android 中无法安装
- angular - Application State Reducer 不接受布尔有效负载
- react-native - react-native-fs [错误:无法创建目录]
- r - ggplot直方图按小时
- algorithm - 求蒙特卡罗算法的时间和空间复杂度