当前位置: 代码迷 >> python >> Pandas df.mode ValueError:错误的项目数通过 5,放置意味着 1
  详细解决方案

Pandas df.mode ValueError:错误的项目数通过 5,放置意味着 1

热度:114   发布时间:2023-07-16 10:50:23.0

我有一个带有一些空值的 Pandas 数据框(名为 all_samples_z_df):

        sample1     sample2    sample3  mean median mode
pos1      2           4           2       2     2
pos2      1                       1       1     1   
pos3      3           5                   4     4      

当我创建均值或中值列时没有问题,但是当我尝试创建模式列时出现此错误:ValueError:错误的项目数通过 5,放置意味着 1

我正在使用此命令,这些命令在熊猫手册中有所说明,但我收到了该模式的错误。 你知道我该如何解决这个问题吗?

all_samples_z_df['mean'] = all_samples_z_df.mean(axis=1)
all_samples_z_df['median'] = all_samples_z_df.median(axis=1)
all_samples_z_df['mode'] = all_samples_z_df.mode(axis=1)

我注意到 DataFrame 中的“空”字段被打印为空格(而不是NaN )。 所以我假设你的每一列至少包含一个空间是对象类型。 要验证它,请运行all_samples_z_df.info()

要计算均值中值,所有样本...列都应该是数字类型,否则它们将被忽略。

均值列的结果中可以看到这种“忽略大小写”。 请注意,第一行的实际平均值是:

(2 + 4 + 2) / 3 = 2.666667

但是您对第 1 行的平均值仅为2 ,因此显然只计算了sample1列。

为了获得正确的值类型,在我的测试中,我创建了一个包含以下内容的源文件:

,sample1,sample2,sample3
pos1,2,4,2
pos2,1,,1
pos3,3,5,

并阅读它调用:

all_samples_z_df = pd.read_csv('input.csv', index_col=0)

得到:

      sample1  sample2  sample3
pos1        2      4.0      2.0
pos2        1      NaN      1.0
pos3        3      5.0      NaN

所以现在“空”值打印为NaN

当你运行all_samples_z_df.info() ,你会看到

  • sample1列是int64类型,
  • 剩下的两列都是float64类型。

另一个提示:当您计算所有函数时,您应该使用 3 个初始列。 否则,较早计算的列将作为其他计算中的源包括在内,这可能不是您想要的。

现在,没有任何障碍,您可以运行:

all_samples_z_df['mean'] = all_samples_z_df.iloc[:, 0:3].mean(axis=1)
all_samples_z_df['median'] = all_samples_z_df.iloc[:, 0:3].median(axis=1)

(注意iloc[:, 0:3].添加到两个指令中)。

到目前为止,结果是:

      sample1  sample2  sample3      mean  median
pos1        2      4.0      2.0  2.666667     2.0
pos2        1      NaN      1.0  1.000000     1.0
pos3        3      5.0      NaN  4.000000     4.0

现在运行all_samples_z_df.iloc[:, 0:3].mode(axis=1) (只是为了查看结果):

        0    1
pos1  2.0  NaN
pos2  1.0  NaN
pos3  3.0  5.0

意思是:

  • 对于前 2 行,最常出现的值分别是21
  • 但在第三行有两个最常出现的值(出现次数相等):
    • 第一个是3
    • 第二个是5

这就是您的问题的根源:两个项目(3 和 5)已作为最后一行中新列的内容传递。

一种可能的解决方案是仅使用多个值中的第一个,因此您可以运行:

all_samples_z_df['mode'] = all_samples_z_df.iloc[:, 0:3].mode(axis=1)[0]

相反(注意添加[0] )。

现在的结果是:

      sample1  sample2  sample3      mean  median  mode
pos1        2      4.0      2.0  2.666667     2.0   2.0
pos2        1      NaN      1.0  1.000000     1.0   1.0
pos3        3      5.0      NaN  4.000000     4.0   3.0
  相关解决方案