如何在Pandas长格式DataFrame中计算行组间比率(无需转置)
解决长格式DataFrame计算每房间平米数的问题
假设你的DataFrame结构类似这样(核心是每个观测主体对应两行数据,分别记录房间数和住宅面积):
import pandas as pd data = { 'id': [1,1,2,2,3,3], 'Metric': ['Nb rooms', 'Squared meters', 'Nb rooms', 'Squared meters', 'Nb rooms', 'Squared meters'], 'Value': [3, 90, 2, 60, 4, 120] } df = pd.DataFrame(data)
方法一:Groupby + Apply 直接计算
用groupby按观测主体(比如示例中的id,替换成你数据里的分组列)分组,在每个组内筛选两个指标的值做除法:
# 计算每个观测的每房间平米数,生成单独的结果表 ratio_df = df.groupby('id').apply( lambda group: group[group['Metric'] == 'Squared meters']['Value'].iloc[0] / group[group['Metric'] == 'Nb rooms']['Value'].iloc[0] ).reset_index(name='Squared meters / room') # 若要把结果合并回原长格式DataFrame,用merge关联 df = df.merge(ratio_df, on='id')
方法二:Groupby + Agg 提取指标后计算
先分组提取每个观测的房间数和面积,再计算比率,可读性更强:
# 分组提取两个指标的数值 metrics_df = df.groupby('id').agg( squared_meters=('Value', lambda x: x[df.loc[x.index, 'Metric'] == 'Squared meters'].iloc[0]), nb_rooms=('Value', lambda x: x[df.loc[x.index, 'Metric'] == 'Nb rooms'].iloc[0]) ) # 计算每房间平米数 metrics_df['Squared meters / room'] = metrics_df['squared_meters'] / metrics_df['nb_rooms']
注意事项
- 确保每个分组(比如
id)内同时存在且仅存在Nb rooms和Squared meters两个Metric值,否则会触发索引越界错误。如果有缺失数据,可以在lambda中添加判断(比如if len(...) > 0)。 - 把示例中的
id替换成你数据里用来标识单个观测的列(比如房源编号、用户ID等)。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

