提取Pandas DataFrame指定列作为y时数组对比出现False的原因
Pandas提取列生成数组对比出现False的原因
问题背景
从Pandas DataFrame提取特定列作为y时,用两种方法得到的数组元素看起来完全一致,但直接对比却出现大量False值:
两种实现方法
# 第一种方法 y_df = df[specific_column] y_array = np.array(y_df) X_df = df.drop(columns=[specific_column]) X_array = np.array(X_df) # 第二种方法 features = ['some columns in my dataset'] y = np.array(df.loc[:, [specific_column]].values) X_df = df.loc[:, features].values
对比结果
执行y[:4]==y_array[:4]得到:
array([[ True, True, False, False], [ True, True, False, False], [False, False, True, True], [False, False, True, True]])
但查看两个数组的元素,内容完全一致:
y[:4], y_array[:4] (array([[0], [0], [1], [1]], dtype=int64), array([0, 0, 1, 1], dtype=int64))
原因分析
这是数组维度不匹配导致的:
- 第一种方法中,
df[specific_column]提取的是Pandas Series,转成NumPy数组后是一维数组(形状为(4,)) - 第二种方法中,
df.loc[:, [specific_column]]用方括号包裹列名,提取的是单列DataFrame,转成NumPy数组后是二维数组(形状为(4,1))
当一维数组和二维数组做==对比时,NumPy会触发广播机制:把一维数组(4,)扩展为(4,4),二维数组(4,1)也扩展为(4,4),之后逐元素交叉对比,就出现了你看到的结果。
解决办法
要让两个数组能正确对比,只需统一维度:
- 把二维数组转成一维:用
y.ravel() == y_array或y.squeeze() == y_array - 调整第二种方法的提取逻辑:直接提取Series而非DataFrame,写成
y = np.array(df.loc[:, specific_column])(去掉列名外的方括号)
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

