如何对含非数值列的两个pandas DataFrame做除法并保留非数值列?
解决pandas DataFrame除法时保留非数值列的问题
这个报错太常见啦——div()默认会尝试对所有列执行除法操作,而你的Group列是字符串类型,字符串之间没法做除法运算,自然就抛出TypeError了。下面给你两种实用的解决方案:
方法一:自动识别数值列处理(适合多数值列场景)
先提取两个DataFrame里的数值列完成除法计算,再把非数值列拼接回去,不用手动列名:
import pandas as pd a = pd.DataFrame( [ ['group1', 1., 2.], ['group1', 3., 4.], ['group1', 5., 6.] ], columns=['Group', 'A', 'B'] ) b = pd.DataFrame( [ ['group1', 7., 8.], ['group1', 9., 10.], ['group1', 11., 12.] ], columns=['Group', 'A', 'B'] ) # 筛选出所有数值列执行除法 numeric_div_result = b.select_dtypes(include='number').div(a.select_dtypes(include='number')) # 拼接非数值列(这里取a的Group列,和b的内容一致) final_result = pd.concat([a[['Group']], numeric_div_result], axis=1) print(final_result)
执行后输出:
Group A B 0 group1 7.000000 4.000000 1 group1 3.000000 2.500000 2 group1 2.200000 2.000000
方法二:手动指定数值列(适合列数少、明确目标列的场景)
直接复制原DataFrame的结构,只对需要计算的数值列替换结果,逻辑更直观:
import pandas as pd a = pd.DataFrame( [ ['group1', 1., 2.], ['group1', 3., 4.], ['group1', 5., 6.] ], columns=['Group', 'A', 'B'] ) b = pd.DataFrame( [ ['group1', 7., 8.], ['group1', 9., 10.], ['group1', 11., 12.] ], columns=['Group', 'A', 'B'] ) # 复制a的结构,保留非数值列 final_result = a.copy() # 对指定数值列执行除法并替换原数据 final_result[['A', 'B']] = b[['A', 'B']].div(a[['A', 'B']]) print(final_result)
输出和上面完全一致,适合你明确知道哪些是数值列的场景。
小提醒
如果你的非数值列在两个DataFrame中内容不一样,记得根据需求选择保留哪一个的非数值列(比如用a[['Group']]还是b[['Group']])。
内容的提问来源于stack exchange,提问作者pault
相关产品推荐
相关产品推荐

