如何按位置对两个不同DataFrame的对应元素执行除法运算
问题原因
你运行结果全为NaN的核心原因是:pandas的DataFrame算术运算会自动按列名、行索引对齐,你的df1数值列列名为Set1/Set2/Set3,df2数值列列名为AK/BD/CL,列名完全不匹配,对齐后所有位置都找不到对应值,因此结果全为NaN。
解决方法
如果确认两个DataFrame的行顺序、数值列的顺序完全对应,可参考以下两种实现方案:
方案1:直接调用numpy数组按位置运算
import pandas as pd # df1、df2定义代码保持不变 df1 = pd.DataFrame({'Name': ["cat", "dog", "fish"], 'Set1': [20, 10, 0], 'Set2': [15, 0, 12], 'Set3': [0, 0, 6]}) df2 = pd.DataFrame({'Name': ["cat", "dog", "fish"], 'AK': [2, 2, 0], 'BD': [5, 1, 3], 'CL': [1, 0, 6]}) df1.set_index('Name', inplace=True) df2.set_index('Name', inplace=True) # 取底层numpy数组按位置做除法,再还原DataFrame结构 df3 = pd.DataFrame(df1.values / df2.values, index=df1.index, columns=df1.columns) # 处理0/0得到的空值,转换为整数格式 df3 = df3.fillna(0).astype(int).reset_index()
方案2:对齐列名后做除法
df1.set_index('Name', inplace=True) df2.set_index('Name', inplace=True) # 将df2的列名临时替换为和df1一致,再做运算 df2_tmp = df2.set_axis(df1.columns, axis=1) df3 = (df1 / df2_tmp).fillna(0).astype(int).reset_index()
两种方案输出的df3都和预期结果一致:
Name Set1 Set2 Set3 0 cat 10 3 0 1 dog 5 0 0 2 fish 0 4 1
内容的提问来源于stack exchange,提问作者user2110417
相关产品推荐
相关产品推荐

