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

时间:2017-04-13 20:10:33

标签: python pandas dataframe rounding typeerror

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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