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

按URL匹配计算不同列长DataFrame的VIEWS差值,代码异常求解决

问题分析与解决

原代码的明显问题

  • 逻辑完全偏离需求:你用concat拼接两个DF后,靠groupby+diff计算差值,本质是取每组内后一条记录减前一条的结果,这根本不是“匹配同URL后计算a、b的VIEWS差值”的逻辑。如果某个URL只在其中一个DF里存在,diff直接输出NaN;要是同一个URL在单个DF里有多条,结果更是彻底混乱,这就是你看到大量NaN的核心原因。
  • 浮点数问题:diff运算后,因为NaN属于float类型,整列会自动转为float,哪怕你之前把VIEWS转成int也没用。

更优解决方案

直接用merge按URL精准匹配两个DF,再计算差值,逻辑清晰结果准确:

# 给两个DF的VIEWS列重命名,避免合并后列名冲突
a_processed = a.loc[:, ['VIEWS', 'URL']].rename(columns={'VIEWS': 'VIEWS_a'})
b_processed = b.loc[:, ['VIEWS', 'URL']].rename(columns={'VIEWS': 'VIEWS_b'})

# 按URL全连接,确保所有在a或b中出现的URL都被保留
merged_df = pd.merge(a_processed, b_processed, on='URL', how='outer')

# 转换数值类型,空值填充为0并转成整数
merged_df['VIEWS_a'] = pd.to_numeric(merged_df['VIEWS_a'], errors='coerce').fillna(0).astype(int)
merged_df['VIEWS_b'] = pd.to_numeric(merged_df['VIEWS_b'], errors='coerce').fillna(0).astype(int)

# 计算差值的绝对值(不需要绝对值可以直接去掉abs)
merged_df['VIEWS_DIFF'] = abs(merged_df['VIEWS_a'] - merged_df['VIEWS_b'])

# 按需提取最终需要的列
result_df = merged_df.loc[:, ['URL', 'VIEWS_DIFF']]

补充说明

  • 用how='outer'是为了保留所有URL;如果只需要两个DF都有的URL,改成how='inner'即可。
  • 重命名列是为了明确区分来自a和b的VIEWS值,避免合并后出现歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:25:13