如何在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
相关产品推荐
相关产品推荐

