Pandas两列逐元素除法返回多列异常问题求助
问题原因与解决方法
问题根源
- 列索引初始化错误:你创建df时写了
df = pd.DataFrame(columns=['image_name partition zeros ones total'.split()]),其中split()已经返回包含5个列名的列表,但额外套的一层方括号,让Pandas将列解析为多级索引(MultiIndex),而非普通单级列名。 - 运算结果类型不匹配:当列是多级索引时,
df["zeros"]和df["total"]返回的不是单个Series,而是DataFrame。两者做除法时会触发广播,返回包含原两列的全NaN DataFrame,无法赋值给单个result列,因此抛出ValueError。 - 逐行append的隐性问题:这种迭代追加的方式效率极低(每次append都会生成新的DataFrame),还容易因索引匹配错误引入问题。
解决方法
方法1:修正初始化逻辑(保留逐行写法,不推荐)
去掉columns参数外层的方括号,让列名成为普通单级索引:
import pandas as pd # 修正columns的写法,移除外层方括号 df = pd.DataFrame(columns='image_name partition zeros ones total'.split()) data = { 'dataset': ['177.png', '276.png', '208.png', '282.png'], 'partition': ['green', 'green', 'green', 'green'], 'zeros': [1896715, 1914720, 1913894, 1910815], 'ones': [23285, 5280, 6106, 9185], 'total': [1920000, 1920000, 1920000, 1920000] } for i in range(len(data['ones'])): row = [] for k in data.keys(): row.append(data[k][i]) df = df.append(pd.Series(row, index=df.columns), ignore_index=True) df["result"] = df["zeros"] / df["total"] print(df)
方法2:直接构造DataFrame(高效推荐)
抛弃逐行追加,直接用字典构造并修正列名映射,这是Pandas的标准高效写法:
import pandas as pd data = { 'dataset': ['177.png', '276.png', '208.png', '282.png'], 'partition': ['green', 'green', 'green', 'green'], 'zeros': [1896715, 1914720, 1913894, 1910815], 'ones': [23285, 5280, 6106, 9185], 'total': [1920000, 1920000, 1920000, 1920000] } # 直接构造DataFrame并修正列名(dataset -> image_name) df = pd.DataFrame(data).rename(columns={'dataset': 'image_name'}) df["result"] = df["zeros"] / df["total"] print(df)
这种写法不仅避免了索引错误,还将时间复杂度从O(n²)降到O(n),性能提升显著。
内容的提问来源于stack exchange,提问作者Luca Clissa
相关产品推荐
相关产品推荐

