如何用不同值对DataFrame的各行执行除法运算?
问题:DataFrame每行除以不同值后无变化的原因及解决方法
我有一个简单的DataFrame,希望将每行数据除以不同的值(此处各行是周数据的总和,需除以对应月份的周数)。执行以下代码后无任何变化,结果与除法操作前一致,尝试使用常量调用div函数也得到相同结果。请问问题出在哪里?
用户代码:
number_of_weeks = [4,4,5,1] for i in range(len(df_Plot.index)): df_Plot.iloc[[i][:]].div(number_of_weeks[i])
原始DataFrame示例:
A B C D Date 2023-01-31 0.0325 3.6375 0.0000 0.025 2023-02-28 0.0300 1.7000 0.0000 0.000 2023-03-31 0.0000 0.4375 0.1875 0.000 2023-04-30 0.0250 0.5500 0.4250 0.000
问题原因
- Pandas方法的返回特性:
div()方法默认返回一个新的DataFrame/Series对象,不会直接修改原数据。你的代码仅调用了div(),但未将计算结果赋值回原DataFrame的对应行,因此原数据完全没有变化。 - 冗余的索引切片:
iloc[[i][:]]属于多余写法,等价于iloc[[i]],这部分不影响功能,但增加了代码复杂度。
解决方法
方法一:利用广播机制(推荐,无需循环)
将周数列表转换为与DataFrame索引匹配的Series,Pandas会自动按行匹配执行除法,效率远高于循环:
import pandas as pd number_of_weeks = [4,4,5,1] # 创建与原DataFrame索引一致的Series week_series = pd.Series(number_of_weeks, index=df_Plot.index) # 执行除法并覆盖原DataFrame df_Plot = df_Plot.div(week_series, axis=0)
方法二:修正循环逻辑(适合理解基础操作)
如果坚持使用循环,需将div()的结果赋值回原DataFrame的对应行:
number_of_weeks = [4,4,5,1] for i in range(len(df_Plot.index)): # 对单行执行除法,并赋值回原位置 df_Plot.iloc[i] = df_Plot.iloc[i].div(number_of_weeks[i])
执行上述任一方法后,原DataFrame会更新为每行除以对应周数后的结果。
内容的提问来源于stack exchange,提问作者Jim Rutter
相关产品推荐
相关产品推荐

