如何舍入具有混合数据类型的 pandas 数据框中的浮点(十进制)值?

How to roundoff float (decimal) values in pandas dataframe that have mixed data types?

在以下 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)

但是,我收到错误消息,指出某些值 (-) 是字符串。

使用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

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

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