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

如何在Pandas中基于配对行计算新增rel_count列?

Pandas实现配对行count比值的最优方法

核心思路

咱们要解决的是配对行的count比值计算问题,核心是先把1a/1b、2a/2b这类配对行归为同一组,然后在组内让每行的count除以组内另一行的count。

最优实现方法(简洁高效)

利用groupby结合transform方法,一步到位生成目标列,不需要额外的合并操作,代码简洁且性能优异:

import pandas as pd

# 初始化数据
df = pd.DataFrame([['1a', 'A', 5], ['1b', 'B', 10], ['2a', 'C', 20],['2b', 'D', 4]], columns=['id', 'name', 'count'])

# 第一步:提取配对组的标识(去掉id最后一位的a/b)
df['group_key'] = df['id'].str[:-1]

# 第二步:分组后用transform实现组内两两相除
# transform会把lambda的计算结果广播回原数据的每一行
# x.iloc[::-1]是把组内的count倒序,这样刚好实现配对行的互除
df['rel_count'] = df['count'] / df.groupby('group_key')['count'].transform(lambda x: x.iloc[::-1].values)

# 可选:删除临时的group_key列
df = df.drop('group_key', axis=1)

print(df)

执行后输出的结果完全符合预期:

id name  count  rel_count
0  1a    A      5        0.5
1  1b    B     10        2.0
2  2a    C     20        5.0
3  2b    D      4        0.2

方法优势

  • 简洁性:仅需两行核心代码完成计算,逻辑清晰易懂
  • 高效性:避免了额外的merge/join操作,在大数据量场景下性能更优
  • 通用性:不管配对行的顺序是a在前还是b在前,只要是两两配对,这个方法都能正确计算

备选方法(宽表转换法)

如果偏好先转宽表再计算的思路,也可以用unstack/stack的方式实现,不过步骤相对繁琐:

import pandas as pd

df = pd.DataFrame([['1a', 'A', 5], ['1b', 'B', 10], ['2a', 'C', 20],['2b', 'D', 4]], columns=['id', 'name', 'count'])

# 拆分id为组标识和后缀
df['group_key'] = df['id'].str[:-1]
df['suffix'] = df['id'].str[-1]

# 转宽表:以组为索引,后缀为列,展示count值
wide_df = df.set_index(['group_key', 'suffix'])['count'].unstack()

# 计算两个后缀的比值
wide_df['a_rel'] = wide_df['a'] / wide_df['b']
wide_df['b_rel'] = wide_df['b'] / wide_df['a']

# 把结果合并回原数据
df = df.merge(
    wide_df[['a_rel', 'b_rel']].stack().rename('rel_count'),
    left_on=['group_key', 'suffix'],
    right_index=True
)

# 删除临时列
df = df.drop(['group_key', 'suffix'], axis=1)

这个方法也能得到正确结果,但相比第一种方法,多了宽表转换和合并的步骤,数据量大时性能会稍差一些。

内容的提问来源于stack exchange,提问作者reynoldsnlp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:02:49