按列名逐行列减法报错,使用iloc却正常,求助原因
问题原因分析
列名是多级索引(MultiIndex),而非普通字符串列名
从df_2.columns的输出能看到,所有列名都是单元素元组(比如('flow_in_FI',)),不是单纯的字符串。你直接用字符串'flow_in_DK1'索引时,Pandas会尝试匹配多级索引的层级,一旦返回的是包含多列的DataFrame而非单列Series,赋值给新列时就会触发Cannot set a DataFrame with multiple columns to the single column DK1_NP错误。
而iloc[:,16]是按位置直接取单列,得到的是Series,计算后还是Series,所以能正常赋值。TypeError: unhashable type: 'numpy.ndarray'的原因
这个错误说明你的MultiIndex列名里,存在元素为numpy数组的情况(虽然你贴的输出里没显示,但报错明确指向不可哈希的numpy数组)。Pandas要求索引(包括列名)的元素必须可哈希,numpy数组不满足这个要求,所以调用head()这类需要处理列名的方法时会报错。正确的列名索引方式
你可以先执行type(df_2.columns[0])确认列名是元组类型。如果要通过列名取数,得用元组形式索引:df_2['DK1_NP'] = df_2[('flow_in_DK1',)] - df_2[('flow_out_DK1',)]这样就能拿到单列Series,计算后赋值给新列就不会出错。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

