You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:42:12