问题描述
我有一个带有一些空值的 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)
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 行,最常出现的值分别是2和1 。
-
但在第三行有两个最常出现的值(出现次数相等):
- 第一个是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