pandas中如何将DataFrame各行数据除以对应月份的天数
逐行除以对应月份天数的实现方案
样例中行索引0对应2022年1月(共31天)、行1对应2022年2月(2022是平年,共28天)、行2对应2022年3月(共31天)。
直接用pandas原生向量化运算实现即可,不需要写循环逐行处理,原表中的NaN值会自动保留,不需要额外做缺失值预处理:
- 第一步:严格按照DataFrame的行顺序,构造对应月份的天数列表
# 顺序和行顺序一一对应:1月、2月、3月的自然天数 month_days = [31, 28, 31]
- 第二步:调用
div()方法做按行广播除法,必须指定参数axis=0,表示按行对齐做运算——即每一行的所有数值列,都除以该行对应的天数
df = df.div(month_days, axis=0)
踩坑提醒
- 别直接写
df / month_days:pandas默认四则运算是按列对齐广播,直接相除会把列表值按列顺序匹配,列数和列表长度不一致时会直接报错,必须显式指定axis=0才能按行对齐运算。 - 该方法是向量化实现,比用
apply逐行计算的效率高很多,数据量越大优势越明显。 - 后续如果要追加新月份的行,只需要把对应月份的天数按行顺序追加到
month_days列表里即可,不需要修改核心运算逻辑。
运算完成后的输出结果如下:
A B C D E G 0 7.129032 3.838710 14.677 NaN 21.838710 NaN 1 12.214286 43.678571 4.75 130.785714 NaN 11.464286 2 8.129032 NaN 1.71 NaN NaN NaN
如果涉及闰年2月、或者跨更多年份月份的场景,只需要调整month_days列表里的对应天数即可,逻辑完全通用。
内容的提问来源于stack exchange,提问作者Robert Tuttle
相关产品推荐
相关产品推荐

