【问题标题】:How to roundoff float (decimal) values in pandas dataframe that have mixed data types?如何舍入具有混合数据类型的熊猫数据框中的浮点(十进制)值?
【发布时间】:2017-09-10 02:05:41
【问题描述】:

在以下 pandas 数据框中:

df = 

contig  pos ref haplotype_block hap_X   hap_Y   odds_ratio  My_hap  Sp_hap
2   2969    C   3706    T   C   0.013000000000000001    C   T
2   3222    G   3706    G   C   -   C   G
2   3416    G   3706    A   G   -   G   A
2   5207    T   1856    T   A   167.922 T   A
2   5238    G   1856    C   G   -   C   G
2   5398    A   1856    A   G   -   A   G
2   5403    A   1856    A   G   -   A   G
2   5426    C   1856    C   A   -   C   A

我想对odds_ratio 列中的值进行四舍五入。但是,该列中的一些数据是字符串。所以我尝试使用 lambda

df['odds_ratio'] = df['odds_ratio'].astype(float).round(3)

但是,我收到一些值 (-) 是字符串的错误消息。

【问题讨论】:

    标签: python pandas dataframe rounding typeerror


    【解决方案1】:

    使用to_numericfillna

    pd.to_numeric(df.odds_ratio, 'coerce').round(2).fillna(df.odds_ratio)
    
    0      0.01
    1         -
    2         -
    3    167.92
    4         -
    5         -
    6         -
    7         -
    Name: odds_ratio, dtype: object
    

    分配回去

    df.assign(
        odds_ratio=
            pd.to_numeric(df.odds_ratio, 'coerce').round(4).fillna(df.odds_ratio)
    )
    
       contig   pos ref  haplotype_block hap_X hap_Y odds_ratio My_hap Sp_hap
    0       2  2969   C             3706     T     C      0.013      C      T
    1       2  3222   G             3706     G     C          -      C      G
    2       2  3416   G             3706     A     G          -      G      A
    3       2  5207   T             1856     T     A    167.922      T      A
    4       2  5238   G             1856     C     G          -      C      G
    5       2  5398   A             1856     A     G          -      A      G
    6       2  5403   A             1856     A     G          -      A      G
    7       2  5426   C             1856     C     A          -      C      A
    

    【讨论】:

      【解决方案2】:

      我花了一些时间才找到一个简单的、内存高效的解决方案:

      df = 
      
      contig  pos ref haplotype_block hap_X   hap_Y   odds_ratio  My_hap  Sp_hap
      2   2969    C   3706    T   C   0.013000000000000001    C   T
      2   3222    G   3706    G   C   -   C   G
      2   3416    G   3706    A   G   -   G   A
      2   5207    T   1856    T   A   167.922 T   A
      2   5238    G   1856    C   G   -   C   G
      2   5398    A   1856    A   G   -   A   G
      2   5403    A   1856    A   G   -   A   G
      2   5426    C   1856    C   A   -   C   A
      

      解决方案:

      df['log_odds_ratio'] = df['log_odds_ratio'].apply(lambda x: round(x, 3) if type(x) is float else x)
      
      print(df)
      
      contig  pos ref haplotype_block hap_X   hap_Y   odds_ratio  My_hap  Sp_hap
      2   2969    C   3706    T   C   0.013   C   T
      2   3222    G   3706    G   C   -   C   G
      2   3416    G   3706    A   G   -   G   A
      2   5207    T   1856    T   A   167.922 T   A
      2   5238    G   1856    C   G   -   C   G
      2   5398    A   1856    A   G   -   A   G
      2   5403    A   1856    A   G   -   A   G
      2   5426    C   1856    C   A   -   C   A
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-30
        • 2012-11-10
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2013-06-25
        相关资源
        最近更新 更多