【问题标题】:round a single column in pandas在熊猫中舍入一列
【发布时间】:2014-10-01 03:11:41
【问题描述】:

有没有办法在 Pandas 中舍入单个列而不影响数据框的其余部分?

>>> print(df)
  item  value1  value2
0    a    1.12     1.3
1    a    1.50     2.5
2    a    0.10     0.0
3    b    3.30    -1.0
4    b    4.80    -1.0

我尝试了以下方法:

>>> df.value1.apply(np.round)
0    1
1    2
2    0
3    3
4    5
5    5

使数据看起来像这样的正确方法是什么:

  item  value1  value2
0    a       1     1.3
1    a       2     2.5
2    a       0     0.0
3    b       3    -1.0
4    b       5    -1.0
5    c       5     5.0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你很亲密。 您将回合应用于df.value1 给出的一系列值。 因此返回类型是一个系列。 您需要将该系列分配回数据框(或具有相同索引的另一个数据框)。

    另外,还有一个pandas.Series.round 方法,它基本上是pandas.Series.apply(np.round) 的简写。

    >>> df.value1 = df.value1.round()
    >>> print df
      item  value1  value2
    0    a       1     1.3
    1    a       2     2.5
    2    a       0     0.0
    3    b       3    -1.0
    4    b       5    -1.0
    

    【讨论】:

    • 谢谢。错过这个感觉不太好:)
    • 熊猫(至少对我而言)不是自然而然的。我很确定在上周左右阅读了另一个 SO 答案后,我知道了如何做到这一点。但我找不到它再次标记为重复,所以这可能是一个稍微不同的问题。
    • @LyndonWhite 可以使用df["value1"].round() 吗?还有 round upround down 功能吗?如果列名中有空格怎么办?即value 1 - 我假设df.value 1.round() 会失败?
    • 看起来你有 3 个问题。使用“提问”按钮 3 次。
    • 您甚至可以通过说 df.round() 来舍入整个数据帧。无需为每一列给出
    【解决方案2】:

    由于某种原因,如果您有许多小数位的浮点数,round() 方法将不起作用,但它会。

    decimals = 2    
    df['column'] = df['column'].apply(lambda x: round(x, decimals))
    

    【讨论】:

    • df.column_name.round() 似乎适用于输出格式。 lambda 的应用实际上改变了底层存储的值。
    • @StephanDoliov 没错,精度问题困扰了我很长时间。 round()只能设置显示精度,不能设置存储值。
    • 这给出了 SettingWithCopyWarning
    【解决方案3】:

    无需使用 for 循环。它可以直接应用于数据框的列

    sleepstudy['Reaction'] = sleepstudy['Reaction'].round(1)
    

    【讨论】:

      【解决方案4】:

      像这样使用pandas.DataFrame.round() 方法:

      df = df.round({'value1': 0})
      

      任何未包含的列将保持原样。

      【讨论】:

        【解决方案5】:

        如果您正在做机器学习并使用 tensorflow,许多浮点数是“float32”,而不是“float64”,并且此线程中提到的任何方法都可能不起作用。您必须先转换为 float64。

        x.astype('float')
        

        回合前(...)。

        【讨论】:

          【解决方案6】:
          saldo_acred['cumsum_prc_saldo'].astype('float').round(2)
          

          【讨论】:

            【解决方案7】:

            无需使用 lambda 或创建函数。这是直截了当的。 请参阅下面的示例

            df['decimal_place_2'] = df['decimal_place_2'].round(2)
            

            【讨论】:

            • 我认为这个问题的答案需要更新...Tx
            【解决方案8】:

            在我的例子中,我在单列中有字符串值和十进制值。

            def round_2(x):
                try:
                    return round(x,2)
                except:
                    return x
            
            df['cur_TMIN_IMD_WeekSum']=df['cur_TMIN_IMD_WeekSum'].apply(round_2)
            

            【讨论】:

              猜你喜欢
              • 2017-05-09
              • 1970-01-01
              • 2022-08-16
              • 2020-04-13
              • 1970-01-01
              • 2018-12-20
              • 1970-01-01
              • 2020-01-05
              • 2018-10-23
              相关资源
              最近更新 更多