【问题标题】:Converting data frame column values to decimal values将数据框列值转换为十进制值
【发布时间】:2021-11-10 06:07:48
【问题描述】:

我的数据集有两列,“A”和“B”,它们都有百分比值,但属于对象数据类型。例如,

A% B%
1.x% 3.x%
2.x% 4.x%

目标:我最感兴趣的是将它用于机器学习集群,因此我的目标是将其转换为十进制形式。例如,将 '1.2%' 对象值转换为浮点值 0.012。

我尝试了两种方法:第一种是成功的,但是花了很长时间。

  1. 我使用 pandas.Series.str.strip 将对象 % 从 '34%' 中删除或剥离为 '34' obj,然后使用 .to_numeric() --> 34 将此值转换为浮点数。现在我将其除以值为 100,结果为 0.34。

  2. 但是,在第二种方式中,我尝试了以下方法,

功能:

def Tab_to_float(z):
    return float(z.strip('%'))/100

现在当我通过如下列(这是一个对象)时:

Tab_to_float(df['A']) 

我得到错误:

AttributeError: 'Series' 对象没有属性 'strip'

我尝试为这个函数提供一个 int、float、numpy 数组,甚至是一个数据框,但我得到了同样的错误:'that' object has no attribute'strip'。我不确定我哪里出错了。有没有更好的方法来处理这些要求?非常感谢任何帮助!

【问题讨论】:

  • 您需要使用.str 访问器,因为您要传递整个系列。即z.str.strip('%')。但另一个问题是,如果实际值包含x,那么它不能转换为float。
  • 谢谢@ThePyGuy,我放了 z.str.strip 但它仍然给我错误:无法将系列转换为 。此外,我只是将 x 值作为示例(抱歉造成混淆!) - 它就像数值 25.2%、65.35% 等。x 与那里的任何值一样。
  • return float(z.strip('%'))/100 -> return z.str.rstrip('%').astype(float)/100?
  • 谢谢@Ch3steR!这行得通!真的很感谢你的帮助。你能解释一下 astype( ) 在这里有什么帮助吗?
  • .astype 将您的数据转换为所需的dtype

标签: python pandas dataframe function data-science


【解决方案1】:
df['A'] = df.apply(lambda row : Tab_to_float(row['A']), axis = 1)

您可以对这两列执行此操作,然后您可以应用此功能。

我们正在沿 DataFrame 的轴应用一个函数。 (这里我们正在更改列的每个元素)。在此解决方案中,我们不会更改 Tab_to_float 函数的任何内容。

data = {
        'A':['34.3%', '24%'],
        'B':['32%','33%'] }
 
df = pd.DataFrame(data)

 
df['A'] = df.apply(lambda row : Tab_to_float(row['A']), axis = 1)
df['B'] = df.apply(lambda row : Tab_to_float(row['B']), axis = 1)

print(df)

输出:

       A     B
0  0.343  0.32
1  0.240  0.33

【讨论】:

    【解决方案2】:

    为了让它更有趣,这里有一个 sn-p 用于将所有以 '%' 结尾的列从文本百分比格式转换为浮点数:

    for col in df.filter(regex='.*%'):   # if column name ends in '%'
        df[col] = df[col].str.rstrip('%').astype(float).div(100) # remove %, convert to float, divide by 100
        df.rename(columns={col: col.rstrip('%')}, inplace=True)  # remove the '%' in the column name
    

    输出:

           A      B
    0  0.011  0.033
    1  0.022  0.044
    

    【讨论】:

      【解决方案3】:

      您可以使用 lambda 运算符将函数应用于 pandas 数据框或系列。您可以将列中的每个元素转换为浮点数并除以 100,如下所示:

      (df['A']).apply(lambda x: float(x.strip('%'))/100)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-25
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        相关资源
        最近更新 更多