【问题标题】:Why does Pandas df.mode() return a zero before the actual modal value?为什么 Pandas df.mode() 在实际模态值之前返回零?
【发布时间】:2020-11-13 17:10:16
【问题描述】:

当我在下面的数据帧上运行 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

【问题讨论】:

    标签: pandas mode


    【解决方案1】:

    pd.Series.mode

    返回数据集的模式(s)始终返回 Series,即使只返回一个值。

    这就是它的设计方式。 Series必须有一个索引,它会从 0 开始计数。这样可以确保返回类型是稳定的,无论是否只有一个模式或多个值与模式绑定。

    因此,如果您取一个与模式绑定值的切片,则返回的是一个系列,其中数字 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 的值呢?
    • @ghowe 因为df_mode 是一个DataFrame。它可能只有一列,但它仍然是一个 DataFrame,它是 2D 的。 DataFrame.loc 的返回是一个系列(只要索引不重复),其中索引是 DataFrame 列(在这种情况下,单个 0 列变为单个 0 索引)。另一方面,由于系列是一维的,Series.loc 返回一个值(只要索引不重复)
    【解决方案2】:

    我的想法是,df.mode 返回一个数据框。默认情况下,如果没有给出列值,数据框会将索引分配为列名。在这种情况下,0 被分配,因为这是 pandas/python 开始计数的方式。 因为它是一个数据框,所以更改列名(在这种情况下是索引)的唯一方法是应用 .rename(columnn) 方法。因此,为了得到你需要的东西,你必须这样做;

    df1.iloc[:,3:10].agg('mode', axis=1).reset_index().rename(columns={0:''})
    
       zone run 
    0   2    5   23
    

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多