DataFrame where子句报错:无法将大小为4的数组重塑为(4,4)形状
问题原因分析
报错的核心是pandas.DataFrame.where方法的维度匹配逻辑:
当指定axis=1时,other参数的形状需要和原DataFrame的对应维度匹配,但你传入的一维列表会引发维度歧义:
- 当DataFrame行数≠列数时,pandas能自动推断你要把一维列表按行广播(即每一行不满足条件时,用列表元素对应填充各列);
- 但当行数=列数时,pandas无法区分你是要按行还是按列广播,直接抛出形状不匹配异常;
- 移除
temp2列后(3列),行数也为3,此时传入长度为3的列表,pandas会错误尝试把它当成3行1列的结构reshape成3行3列,因此出现“cannot reshape array of size 3 into shape (3,3)”的报错。
解决方案
你的需求是将staleness>1的行中指定列设为0,完全不需要用where配合列表或全零DataFrame,布尔索引直接赋值是最简洁高效的方式:
import pandas as pd zeroeble_cols = ['volume','trade_count', 'temp', 'temp2'] stalenesses = [0.3, 0.4, 1.2, 3.4] length = len(stalenesses) df = pd.DataFrame(data = {'volume' : [10 for i in range(length)], 'trade_count' : [10 for i in range(length)], 'temp' : [1 for i in range(length)], 'temp2' : [1 for i in range(length)], 'staleness' : stalenesses}) # 直接通过布尔索引定位目标行和列,赋值为0 df.loc[df['staleness'] > 1, zeroeble_cols] = 0 print(df)
如果一定要用where方法并使用列表作为替换值,需要确保other是和目标DataFrame形状一致的二维列表,用列表推导式即可生成:
try: # 生成与df[zeroeble_cols]行数×列数一致的全零二维列表 zero_list = [[0]*len(zeroeble_cols) for _ in range(len(df))] df[zeroeble_cols] = df[zeroeble_cols].where(df['staleness'] <= 1, zero_list, axis=1) except Exception as e: print(f'Exception: {e}') zeroDF = pd.DataFrame(data = {k : [0] for k in zeroeble_cols}) df[zeroeble_cols] = df[zeroeble_cols].where(df['staleness'] <= 1, zeroDF, axis=1)
这样无论行数和列数是否相等,都能保证形状匹配,不会触发异常。
内容的提问来源于stack exchange,提问作者user23873134
相关产品推荐
相关产品推荐

