Python pandas:将一个DataFrame单行除以另一个DataFrame所有行
问题原因
你之前调用df1.iloc[0].div(df2.iloc[:])返回NaN,是pandas算术运算默认的索引+列对齐机制导致的:
df1.iloc[0]是索引为[A,B,C,D]、行标签为0的Series- 直接和全量df2做除法时,pandas会同时匹配行索引和列名,只有行索引为0的行能和Series的行标签匹配上,其余行找不到匹配项就会返回NaN;同时df2里的
time、type是非数值列,本身也不支持除法运算。
实现方案
只需要提取两个DataFrame共有的数值列单独做运算,非数值列保留原值即可,pandas会自动将单行的数值按列广播到所有行,不会出现索引对齐错误:
import pandas as pd # 1. 构造示例数据(和你给出的样例一致) df1 = pd.DataFrame({'A': [10000], 'B': [20000], 'C': [30000], 'D': [40000]}) df2 = pd.DataFrame({ 'time': ['5/2020', '6/2020'], 'type': ['unit', 'unit'], 'A': [1000, 7000], 'B': [4000, 2000], 'C': [900, 600], 'D': [200, 4000] }) # 2. 定义需要做除法的数值列 calc_columns = ['A', 'B', 'C', 'D'] # 复制原df2避免修改原始数据 result = df2.copy() # 3. 对数值列做除法,自动广播到所有行 result[calc_columns] = df1.iloc[0][calc_columns] / result[calc_columns] # 4. 按需保留2位小数,和你给出的预期结果格式对齐 result[calc_columns] = result[calc_columns].round(2)
运行结果
执行后输出的result完全符合你的预期:
time type A B C D 0 5/2020 unit 10.00 5.00 33.33 200 1 6/2020 unit 1.43 10.00 50.00 10
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

