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

不同长度DataFrame分组对比:每24行df1对应1行df2

DataFrame按组匹配长度对比的实现方法

问题背景

  • 两个长度不同的DataFrame:
    • len(df1) = 2400
    • len(df2) = 100

df1结构:

colA  colB  colC
0     1     2   
3     4     5 
6     7     8  
...
2400 rows.

df2结构:

colD  colE  colF
10     11     12    
13     14     15  
...
100 rows

执行对比操作df1['colB'] > df2['colD']时,出现长度不匹配错误:

ValueError: ('Lengths must match to compare', (2400,), (100,))

需求:实现连续24行df1对应1行df2的对比(df1第1-24行对应df2第1行,第25-48行对应df2第2行,以此类推),仅对比colB与colD列。


解决方案

方法1:扩展df2至与df1同长度

直接将df2的每行重复24次,使其长度与df1一致,再执行对比:

# 扩展df2的colD列,每行重复24次
df2_colD_expanded = df2['colD'].repeat(24).reset_index(drop=True)
# 执行对比操作
comparison_result = df1['colB'] > df2_colD_expanded
  • repeat(24):将colD的每个元素重复24次
  • reset_index(drop=True):重置索引,保证和df1的索引完全对齐

方法2:分组匹配(无需扩展行)

通过给df1添加分组标识,和df2的索引对应后再合并对比:

# 给df1添加分组ID:每24行一组,组号从0到99(对应df2的索引)
df1['group_id'] = df1.index // 24
# 给df2添加对应分组ID
df2['group_id'] = df2.index
# 按group_id合并,将df2的colD匹配到对应组的df1行
merged_df = df1.merge(df2[['group_id', 'colD']], on='group_id', how='left')
# 执行对比
comparison_result = merged_df['colB'] > merged_df['colD']
# 可选:删除临时添加的group_id列
merged_df.drop('group_id', axis=1, inplace=True)

方法3:使用Numpy广播(高效简洁)

利用Numpy的数组变形和广播特性,直接完成分组对比:

import numpy as np

# 将df1的colB转为24行一组的二维数组,df2的colD转为列向量后广播对比
comparison_matrix = df1['colB'].values.reshape(-1, 24) > df2['colD'].values[:, np.newaxis]
# 将二维结果转为和df1同长度的一维数组
comparison_result = comparison_matrix.flatten()
  • reshape(-1, 24):把df1的colB拆成100组,每组24个元素
  • [:, np.newaxis]:把df2的colD转为列向量,让Numpy自动广播到每组的24个元素上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:55:30