为什么Pandas的df.mode()函数会在实际众数值前返回一个零?

3
当我在下面的数据框上运行df.mode()时,我得到了预期输出之前的一个前导零。为什么会这样?
df

sample       1   2   3   4   5   6   7   8   9   10
zone run                                                          
2    5      14   12  22  23  24  22  23  22  23  23 

print(df.iloc[:,3:10].mode(axis=1)))

提供

           0
zone run    
2    5    23

期望的
zone run    
2    5    23
2个回答

1

pd.Series.mode

返回数据集的模式(s)。即使只返回一个值,也始终返回Series
这是设计如此的原因。Series必须具有索引,并且索引从0开始计数。这确保了返回类型的稳定性,无论是否只有一个模式或多个值并列为模式。
因此,如果您选择一个值并列为模式的切片,返回的将是一个Series,其中数字0,...N表示与模式并列的N个值(按排序顺序)的指示器。
df.iloc[:, 4:7]
#sample     5   6   7
#zone run            
#2    5    24  22  23


df.iloc[:,4:7].mode(axis=1)
#           0   1   2       # <- 3 values tied for mode so 3 labels
#zone run            
#2    5    22  23  24

就多种模式而言,这是有道理的。但为什么像df_mode.loc[zone=2,run=5]这样的函数返回0 23而不是简单地返回值23呢? - undefined
@ghowe 因为 df_mode 是一个 DataFrame。它可能只有一列,但它仍然是一个二维的 DataFrame。DataFrame.loc 的返回值是一个 Series(只要索引没有重复),其中索引是 DataFrame 的列名(在这种情况下,单个 0 列变成了单个 0 索引)。另一方面,由于 Series 是一维的,Series.loc 返回一个值(只要索引没有重复)。 - undefined

0
我的想法是,df.mode返回一个数据框(dataframe)。默认情况下,如果没有给出列值,数据框会分配索引作为列名。在这种情况下,0被分配,因为这是pandas/python开始计数的方式。 因为它是一个数据框,改变列名的唯一方法(在这种情况下是索引)是应用.rename(columnn)方法。因此,要得到你所需要的,你必须;
df1.iloc[:,3:10].agg('mode', axis=1).reset_index().rename(columns={0:''})

   zone run 
0   2    5   23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接