我有一个标记为“键”的主要组,一个标记为“国家”的子组和一个“成本”值。对于每个主要组“键”,我首先要提取最小成本,然后在其他子组中获取最大“成本”,即从其余国家/地区中获取最大“成本”,而忽略该国家/地区的所有条目最小值取自(最大成本必须是一个单一值,而不是每个其他国家/地区的最大成本)。
我的数据看起来像
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
我的代码是“循环”的,效率不高。请提出一种更好的方法。下面是我的代码。
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
答案 0 :(得分:0)
您绝对不希望对此类操作使用循环。没有行级循环的方法有几种。这是一个:
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
答案 1 :(得分:0)
对于问题的前半部分,您可以使用以下结构:
data.iloc[data.groupby(['key'])['cost'].idxmin().values]
其中data
是您的数据帧,但仍然不知道如何使用此数据帧进行屏蔽而不循环。