热线电话:13121318867

登录
首页大数据时代【CDA干货】Pandas基于两列计算结果:实操指南与实战案例
【CDA干货】Pandas基于两列计算结果:实操指南与实战案例
2026-05-14
收藏

在Python数据分析中,Pandas作为核心工具库,凭借简洁高效的数据处理能力,成为数据分析从业者的必备技能。其中,基于两列(或多列)数据进行计算,是日常数据处理中最高频的操作之一——无论是简单的加减乘除、比例计算,还是复杂的条件运算、自定义函数计算,都能通过Pandas快速实现,最终生成符合业务需求的新结果列,为后续分析、可视化提供支撑。

本文将从基础原理出发,拆解Pandas基于两列计算的核心方法,结合不同行业的实战案例(如电商营收计算、学生成绩分析、金融收益核算),详细讲解实操步骤、常见问题及优化技巧,帮助新手快速上手,同时为资深从业者提供高效办公的参考,让两列计算成为数据分析中的“随手技能”。

一、核心认知:Pandas两列计算的本质与应用场景

Pandas基于两列计算,本质是对DataFrame中指定的两列元素,按行或按列执行指定的运算逻辑,生成新的结果列(SeriesDataFrame)。其核心价值在于“将原始数据转化为有价值的衍生指标”,无需手动遍历数据,凭借Pandas的向量化运算能力,大幅提升数据处理效率。

常见的应用场景覆盖各行各业,例如:

1. 电商场景:通过“单价”和“销量”两列计算“销售额”,通过“订单金额”和“成本”两列计算“利润”;

2. 教育场景:通过“平时成绩”和“期末成绩”两列计算“总成绩”“平均成绩”,通过“得分”和“总分”两列计算“得分率”;

3. 金融场景:通过“本金”和“利率”两列计算“利息”,通过“买入价”和“卖出价”两列计算“收益金额”;

4. 日常办公:通过“入职时间”和“当前时间”两列计算“在职时长”,通过“计划量”和“完成量”两列计算“完成率”。

需要注意的是,Pandas两列计算的前提是“两列数据的维度一致”(即行数相同),且数据类型适配运算逻辑(如数值型数据才能执行加减乘除,日期型数据才能计算时间差),否则会出现运算错误。

二、Pandas基于两列计算的核心方法(从基础到进阶)

Pandas提供了多种基于两列计算的方法,从简单的运算符直接运算,到自定义函数运算,适配不同复杂度的需求。以下按“基础→进阶→高级”的顺序,拆解每种方法的实操步骤、代码示例及适用场景,所有代码均基于Python 3.8+、Pandas 1.5+版本,可直接复制运行。

(一)基础方法:运算符直接运算(最常用、最高效)

对于简单的加减乘除、幂运算等,可直接使用Python内置运算符(+、-、*、/、**等),对两列数据进行向量化运算,无需循环,效率极高。这是日常数据处理中最常用的方法,适合数值型两列的基础计算。

核心语法:df['新列名'] = df['列1'] 运算符 df['列2']

实操案例(电商场景):现有电商订单数据,包含“单价”(unit_price)和“销量”(sales_volume)两列,计算“销售额”(sales_amount)和“毛利润”(gross_profit,假设毛利率为30%,毛利润=销售额×30%)。

代码示例:

import pandas as pd

# 1. 构建模拟电商订单数据
data = {
    'order_id': ['001''002''003''004''005'],
    'unit_price': [59.989.9129.939.969.9],  # 单价(元)
    'sales_volume': [1053208]  # 销量(件)
}
df = pd.DataFrame(data)

# 2. 基于两列计算销售额(单价×销量)
df['sales_amount'] = df['unit_price'] * df['sales_volume']

# 3. 基于销售额(新生成列)和毛利率,计算毛利润(进阶:新列与原有列计算)
df['gross_profit'] = df['sales_amount'] * 0.3

# 查看结果
print(df[['unit_price''sales_volume''sales_amount''gross_profit']])

运行结果解析:通过“单价×销量”直接计算出销售额,再通过“销售额×0.3”计算出毛利润,新列会自动添加到原DataFrame中,实现两列(或新列与原有列)的快速运算。

注意事项:

1. 运算前需确保两列数据均为数值型(int、float),若为字符串型,需先通过astype()方法转换数据类型,否则会出现TypeError;

2. 若两列存在缺失值(NaN),运算结果也会为NaN,需提前通过fillna()、dropna()等方法处理缺失值

3. 除法运算时,需避免“列2”出现0,否则会出现ZeroDivisionError,可通过where()方法规避(如df['列1'] / df['列2'].where(df['列2'] != 0, 1))。

(二)进阶方法:apply()函数运算(适配复杂逻辑)

当两列计算逻辑较为复杂(如包含条件判断、多步运算),单纯的运算符无法满足需求时,可使用apply()函数,结合lambda匿名函数或自定义函数,实现灵活的两列计算。这种方法适配所有复杂场景,是Pandas两列计算的“万能方法”。

核心语法:df['新列名'] = df.apply(lambda x: 运算逻辑(x['列1'], x['列2']), axis=1)

(注:axis=1表示按行运算,x代表每一行的数据,x['列1']、x['列2']分别获取当前行两列的值)

实操案例1(教育场景):现有学生成绩数据,包含“平时成绩”(daily_score)和“期末成绩”(final_score)两列,按“平时成绩×30% + 期末成绩×70%”计算“总成绩”,同时根据总成绩判断“等级”(≥90为A,70-89为B,<70为C)。

代码示例:

import pandas as pd

# 1. 构建模拟学生成绩数据
data = {
    'student_id': ['S001''S002''S003''S004''S005'],
    'daily_score': [8592786588],  # 平时成绩
    'final_score': [9088827095]  # 期末成绩
}
df = pd.DataFrame(data)

# 2. 基于两列计算总成绩(复杂加权计算)
df['total_score'] = df.apply(lambda x: x['daily_score'] * 0.3 + x['final_score'] * 0.7, axis=1)

# 3. 基于总成绩(新列)和两列原始成绩,判断等级(更复杂的条件运算)
def get_grade(row):
    daily = row['daily_score']
    final = row['final_score']
    total = row['total_score']
    # 条件判断:总成绩≥90,或平时、期末均≥85,评为A
    if total >= 90 or (daily >= 85 and final >= 85):
        return 'A'
    elif total >= 70:
        return 'B'
    else:
        return 'C'

df['grade'] = df.apply(get_grade, axis=1)

# 查看结果
print(df[['daily_score''final_score''total_score''grade']])

实操案例2(金融场景):现有理财数据,包含“本金”(principal)和“利率”(rate)两列,计算“年利息”,规则为:本金≥10000元,按利率×1.2计算;本金<10000元,按原利率计算(利息=本金×利率)。

代码示例(lambda函数简化版):

import pandas as pd

data = {
    'user_id': ['U001''U002''U003''U004'],
    'principal': [150008000200005000],  # 本金(元)
    'rate': [0.0350.0320.040.03]  # 年利率
}
df = pd.DataFrame(data)

# 基于两列条件计算年利息
df['annual_interest'] = df.apply(lambda x: x['principal'] * x['rate'] * 1.2 if x['principal'] >= 10000 else x['principal'] * x['rate'], axis=1)

print(df)

注意事项:

1. apply()函数按行运算,效率略低于运算符直接运算,对于百万级以上的大数据量,建议优先使用向量化运算(如numpy结合Pandas);

2. 自定义函数中,需确保逻辑清晰,避免出现索引错误(如调用不存在的列名);

3. 若需传递额外参数(如固定的毛利率、权重),可在apply()中通过args参数传递(如df.apply(lambda x, arg: x['列1']*arg, axis=1, args=(0.3,)))。

(三)高级方法:向量化运算(大数据量优化)

当处理百万级、千万级大数据量时,apply()函数的效率会明显下降,此时可使用Pandas的向量化运算(结合numpy),实现两列计算的高效提速——向量化运算无需按行遍历,直接对整列数据进行运算,效率是apply()的10-100倍。

核心思路:利用Pandas的矢量化特性,结合numpy的运算函数,替代apply()的行遍历,适用于数值型两列的复杂运算、条件运算。

实操案例(大数据量场景):现有千万级电商订单数据(模拟),包含“单价”和“销量”两列,计算“销售额”,并按“销售额≥1000为高价值订单,否则为普通订单”分类。

代码示例(向量化优化):

import pandas as pd
import numpy as np

# 1. 模拟千万级订单数据(1000万行)
np.random.seed(42)  # 固定随机种子,确保结果可复现
n = 10_000_000
data = {
    'unit_price': np.random.uniform(10200, n),  # 单价:10-200元随机
    'sales_volume': np.random.randint(150, n)  # 销量:1-50件随机
}
df = pd.DataFrame(data)

# 2. 向量化计算销售额(效率远高于apply)
df['sales_amount'] = df['unit_price'] * df['sales_volume']

# 3. 向量化条件判断,分类订单类型(替代apply的条件逻辑)
df['order_type'] = np.where(df['sales_amount'] >= 1000'高价值订单''普通订单')

# 查看前5行结果
print(df.head())

# 查看运算耗时(可选)
# %timeit df['sales_amount'] = df['unit_price'] * df['sales_volume']  # 测试耗时

关键优化点:使用np.where()替代apply()的条件判断,使用Pandas原生运算符替代自定义函数,充分利用向量化运算的优势,大幅提升大数据量处理效率。

注意事项:

1. 向量化运算主要适用于数值型数据,对于字符串、日期等非数值型数据,需先进行数据转换

2. 复杂的多条件判断,可使用np.select()函数(如多个区间分类),替代嵌套的np.where(),提升代码可读性;

3. 大数据量运算时,建议避免使用循环、apply(),优先选择向量化运算,减少内存占用和运算时间。

(四)特殊场景:日期/字符串类型两列计算

除了数值型两列计算,Pandas也支持日期型、字符串型两列的计算,适用于特定业务场景,如时间差计算、字符串拼接等。

1. 日期型两列计算:计算两个日期之间的时间差(如在职时长、订单间隔),需先确保两列为datetime类型。

代码示例(办公场景):计算员工“入职日期”和“当前日期”的“在职时长(天)”。

import pandas as pd

# 构建员工数据
data = {
    'employee_id': ['E001''E002''E003'],
    'hire_date': ['2020-01-15''2021-03-20''2022-07-01'],  # 入职日期(字符串)
    'current_date': ['2024-05-14''2024-05-14''2024-05-14']  # 当前日期
}
df = pd.DataFrame(data)

# 转换日期类型
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['current_date'] = pd.to_datetime(df['current_date'])

# 计算在职时长(天)
df['work_days'] = (df['current_date'] - df['hire_date']).dt.days

print(df)

2. 字符串型两列计算:实现两列字符串的拼接、替换等操作,适用于文本处理场景。

代码示例(电商场景):将“商品类别”和“商品名称”两列拼接,生成“商品全称”。

import pandas as pd

data = {
    'category': ['手机''电脑''平板'],
    'product_name': ['苹果15''联想小新''华为MatePad']
}
df = pd.DataFrame(data)

# 字符串拼接(两列拼接,中间加分隔符)
df['product_fullname'] = df['category'] + '-' + df['product_name']

print(df)

注意事项:

1. 日期型两列计算前,必须通过pd.to_datetime()转换为datetime类型,否则会按字符串运算,出现错误;

2. 字符串拼接时,需确保两列均为字符串类型,若包含数值型,需先通过astype(str)转换;

3. 日期差计算后,需通过dt.days、dt.months等属性提取具体的时间单位,否则结果为Timedelta类型。

三、实战综合案例:基于两列计算实现完整数据分析

结合前面的方法,以“电商订单盈利分析”为综合案例,完整演示Pandas基于两列计算的全流程,从数据导入、预处理,到两列计算、结果分析,形成完整的数据分析闭环。

案例需求:现有电商订单数据,包含订单ID、单价、销量、成本、下单日期,需完成以下计算:

1. 计算每笔订单的销售额(单价×销量);

2. 计算每笔订单的利润(销售额-成本);

3. 计算每笔订单的利润率(利润÷销售额,保留2位小数);

4. 按利润率分类:≥30%为高盈利订单,10%-29%为中盈利订单,<10%为低盈利订单;

5. 计算每日的总销售额、总利润,分析盈利趋势。

完整代码示例:

import pandas as pd
import numpy as np

# 1. 导入数据(模拟真实订单数据)
data = {
    'order_id': ['001''002''003''004''005''006''007''008'],
    'unit_price': [59.989.9129.939.969.9199.949.979.9],
    'sales_volume': [10532082156],
    'cost': [35.953.977.923.941.9119.929.947.9],
    'order_date': ['2024-05-10''2024-05-10''2024-05-11''2024-05-11'
                   '2024-05-12''2024-05-12''2024-05-13''2024-05-13']
}
df = pd.DataFrame(data)

# 2. 数据预处理(转换日期类型、处理缺失值
df['order_date'] = pd.to_datetime(df['order_date'])
# 假设存在缺失值,填充成本列缺失值为均值
df['cost'] = df['cost'].fillna(df['cost'].mean())

# 3. 基于两列计算核心指标
# 3.1 销售额(单价×销量)
df['sales_amount'] = df['unit_price'] * df['sales_volume']
# 3.2 利润(销售额-成本)
df['profit'] = df['sales_amount'] - df['cost']
# 3.3 利润率(利润÷销售额,避免除以0,保留2位小数)
df['profit_rate'] = (df['profit'] / df['sales_amount'].where(df['sales_amount'] != 01)).round(2)

# 4. 基于利润率分类(向量化条件判断)
conditions = [
    df['profit_rate'] >= 0.3,
    (df['profit_rate'] >= 0.1) & (df['profit_rate'] < 0.3),
    df['profit_rate'] < 0.1
]
labels = ['高盈利订单''中盈利订单''低盈利订单']
df['profit_level'] = np.select(conditions, labels, default='未知')

# 5. 按日期分组,计算每日总销售额、总利润
daily_analysis = df.groupby('order_date').agg({
    'sales_amount''sum',
    'profit''sum'
}).reset_index()
daily_analysis.columns = ['日期''每日总销售额''每日总利润']

# 查看结果
print("订单详细数据(含计算结果):")
print(df[['order_id''unit_price''sales_volume''cost''sales_amount''profit''profit_rate''profit_level']])
print("n每日盈利分析:")
print(daily_analysis)

结果解析:通过一系列两列计算,生成了销售额、利润、利润率等核心指标,完成了订单盈利分类和每日盈利分析,为电商运营决策(如优化定价、调整品类)提供了数据支撑。这也是日常数据分析中,两列计算的典型应用模式——从基础计算到复杂分类,再到分组汇总,形成完整的分析链路。

四、常见问题与避坑指南

在Pandas基于两列计算的实操中,新手容易遇到数据类型不匹配、缺失值、运算错误等问题,结合实战经验,总结5个高频问题及解决方案,帮助大家避坑:

问题1:两列运算时出现TypeError(类型错误)。

原因:两列数据类型不一致(如一列是int,一列是str),或其中一列包含非数值型数据。

解决方案:通过df.dtypes查看数据类型,使用astype()转换为数值型(如df[&#39;列名&#39;] = df[&#39;列名&#39;].astype(float));若包含无法转换的字符串(如“无数据”),可通过replace()替换为NaN,再用fillna()处理。

问题2:运算结果出现大量NaN。

原因:两列中存在缺失值(NaN),或除法运算中出现0。

解决方案:运算前通过df.isnull().sum()查看缺失值,用fillna()(填充均值、中位数)或dropna()(删除缺失值)处理;除法运算中,用where()规避0分母(如df[&#39;列1&#39;] / df[&#39;列2&#39;].where(df[&#39;列2&#39;] != 0, 1))。

问题3:apply()函数运算效率极低(大数据量场景)。

原因:apply()按行遍历,大数据量下耗时较长。

解决方案:替换为向量化运算(如Pandas原生运算符、numpy函数),或使用Pandas的eval()函数(适用于简单运算,如df.eval(&#39;新列=列1+列2&#39;))。

问题4:日期两列计算出现“Timedelta”类型,无法提取具体天数。

原因:日期差计算后,结果为Timedelta类型,未提取具体时间单位。

解决方案:通过dt属性提取时间单位,如.dt.days(天数)、.dt.months(月数)、.dt.years(年数)。

问题5:两列运算后,新列数据异常(如数值过大、过小)。

原因:数据存在异常值(如单价为0、销量为负数),或运算逻辑错误。

解决方案:运算前通过箱线图、describe()查看异常值,用replace()、dropna()处理;检查运算逻辑,确保公式正确(如利润率=利润÷销售额,而非销售额÷利润)。

五、结语:两列计算,解锁Pandas数据分析的核心能力

Pandas基于两列计算,看似简单,却是数据分析的“基础操作”,也是连接原始数据与业务指标的关键环节。从简单的加减乘除,到复杂的条件运算、大数据量优化,不同的方法适配不同的场景,核心是“用最简单、最高效的方式,将原始数据转化为有价值的信息”。

对于新手而言,建议先掌握“运算符直接运算”,熟悉Pandas的向量化特性,再逐步学习apply()函数、向量化优化,从基础场景入手,多练习、多复盘;对于资深从业者,需注重效率优化,在大数据量场景下优先选择向量化运算,同时结合业务需求,灵活设计运算逻辑,让两列计算成为数据分析的“随手技能”。

未来,随着数据分析场景的不断复杂,两列计算的应用也会更加灵活,但核心逻辑始终不变——立足数据、贴合业务,用Pandas的强大功能,高效完成数据处理,为后续分析、决策提供坚实支撑。无论是电商、教育、金融,还是日常办公,掌握Pandas两列计算,都能大幅提升工作效率,让数据分析更高效、更精准。

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

数据分析师资讯
更多

OK
客服在线
立即咨询
客服在线
立即咨询