按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
相关产品推荐
相关产品推荐

