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

在Pandas中为索引不匹配的两个DataFrame应用自定义函数运算

解决两个DataFrame匹配索引的自定义列运算问题

嗨,我来帮你搞定这个问题!你之前用双重循环生成大矩阵的方法确实有点繁琐,而且会产生大量无用的NaN,其实我们可以用更简洁高效的方式来实现需求——只针对两个DataFrame共有的product_id索引,对对应的count值应用自定义公式。

核心思路

首先把两个DataFrame按索引做内连接(inner join),这样就能直接得到只有共同索引的行,然后再对这些行的count值应用你的自定义公式即可,完全不需要循环或者生成全NaN的矩阵。

具体步骤及代码

1. 合并两个DataFrame(只保留共同索引)

用pd.merge,指定按索引合并,这样只会保留两个DataFrame都有的product_id:

import pandas as pd
import numpy as np

# 你的示例数据
df2_count = pd.DataFrame({'count': [41, 11, 9, 8, 7]}, index=[9014, 8458, 55522, 6969, 8840])
df1_count = pd.DataFrame({'count': [12, 10, 10, 6, 5]}, index=[7545, 8866, 8867, 47196, 9014])

# 合并,给两列加后缀区分来源
merged_df = pd.merge(
    df2_count, 
    df1_count, 
    left_index=True, 
    right_index=True, 
    suffixes=('_df2', '_df1')
)

合并后merged_df的样子:

product_idcount_df2count_df1
9014415

2. 应用自定义公式(两种方式)

我们可以用向量化运算(效率更高,适合大数据)或者apply方法(更直观)来实现你的公式:

方式一:向量化运算(推荐)

用np.where直接对整列进行判断和计算,速度比循环快得多:

merged_df['result'] = np.where(
    merged_df['count_df2'] > merged_df['count_df1'],
    (merged_df['count_df2'] - merged_df['count_df1']) / merged_df['count_df1'] * 100,
    (merged_df['count_df2'] - merged_df['count_df1']) / merged_df['count_df2'] * 100
)
方式二:apply方法(更直观)

如果你更习惯用函数的形式,可以定义函数后用apply逐行处理,还能方便地添加异常判断(比如避免除以0):

def calculate_change(row):
    a = row['count_df2']
    b = row['count_df1']
    # 处理count为0的特殊情况,避免报错
    if a == 0 or b == 0:
        return np.nan
    if a > b:
        return (a - b) / b * 100
    else:
        return (a - b) / a * 100

merged_df['result'] = merged_df.apply(calculate_change, axis=1)

3. 查看并保存结果

此时merged_df里就只有匹配索引的行和对应的计算结果了,你可以直接查看:

print(merged_df)

输出:

product_idcount_df2count_df1result
9014415720.0

最后保存到CSV,比如只保留索引和结果列:

merged_df[['result']].to_csv('output.csv')

为什么你的原方法不好?

  • 双重循环效率极低,数据量大的时候会非常慢;
  • 生成的矩阵大部分是NaN,既浪费内存,又不便于后续处理和阅读;
  • 完全没必要生成行和列分别对应两个DataFrame索引的矩阵,我们只需要共同索引的一对一结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:49:44