【问题标题】:Pandas df.mode ValueError: Wrong number of items passed 5, placement implies 1Pandas df.mode ValueError:错误传递的项目数 5,位置暗示 1
【发布时间】:2020-07-02 15:16:15
【问题描述】:

我有一个带有一些空值的 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: Wrong number of items passed 5, placement means 1

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

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)

【问题讨论】:

  • 请提供minimal reproducible example,以及完整的错误信息。
  • all_samples_z_df['mode'] = all_samples_z_df.mode(axis=1).iloc[:,0] ? : mode 每个文档返回一个 df,因此取第一列

标签: python pandas


【解决方案1】:

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

要计算 meanmedian,所有 sample... 列应该是 数字类型,否则将被忽略。

这个“忽略大小写”从 mean 列的结果中可见。 请注意,第一行的实际平均值为:

(2 + 4 + 2) / 3 = 2.666667

但你的第 1 行的平均值只是 2,所以显然只有 sample1 列 已经算了。

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

,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

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2021-04-08
    • 2020-01-30
    • 2020-04-22
    • 2021-07-13
    • 2019-09-23
    • 2021-07-05
    • 2016-02-14
    • 2021-09-25
    相关资源
    最近更新 更多