数据透视DataFrame后如何避免ValueError: Names should be list-like for a MultiIndex错误?
解决 ValueError: Names should be list-like for a MultiIndex 问题
嘿,我来帮你搞定这个报错!先拆解下你的代码问题:
你的原代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({'foo': ['one', 'one', 'one'], 'baz': [1, 2, 3], 'zoo': ['x', 'y', 'z']}) df1 = df.pivot('baz', 'zoo', 'foo') column = (1, 2) df1[column] = np.nan
错误原因
执行df.pivot('baz', 'zoo', 'foo')后,df1的行索引是baz的取值(1、2、3),列是zoo的取值(x、y、z),列索引是单级结构,并非MultiIndex。但你用元组(1,2)作为索引器访问列时,pandas会默认认为你要操作MultiIndex类型的列,因此抛出了Names should be list-like for a MultiIndex的错误。
针对不同需求的解决方法
需求1:给行索引为1和2的所有列赋值为np.nan
如果你是想修改行数据,要用.loc定位行,并且用列表包裹行索引(不要用元组):
import pandas as pd import numpy as np df = pd.DataFrame({'foo': ['one', 'one', 'one'], 'baz': [1, 2, 3], 'zoo': ['x', 'y', 'z']}) df1 = df.pivot('baz', 'zoo', 'foo') # 选择行索引1和2,给所有列赋值为nan df1.loc[[1, 2], :] = np.nan
需求2:给指定列(比如x和y列)赋值为np.nan
如果你是想修改列数据,要使用正确的列名,同样用列表包裹列名:
import pandas as pd import numpy as np df = pd.DataFrame({'foo': ['one', 'one', 'one'], 'baz': [1, 2, 3], 'zoo': ['x', 'y', 'z']}) df1 = df.pivot('baz', 'zoo', 'foo') # 选择x和y列赋值为nan df1[['x', 'y']] = np.nan
额外说明:如果真的遇到MultiIndex列的情况
如果你的DataFrame列是MultiIndex类型,访问多列时需要用列表包裹元组,比如:
# 示例:列是MultiIndex的场景 multi_col_df = pd.DataFrame( data=[[1,2,3,4]], columns=pd.MultiIndex.from_tuples([('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y')]) ) # 选择('A','x')和('B','y')列赋值 multi_col_df[[('A', 'x'), ('B', 'y')]] = np.nan
内容的提问来源于stack exchange,提问作者dmitri
相关产品推荐
相关产品推荐

