将数据框列值转换为十进制值

Converting data frame column values to decimal values

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

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

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

我试了两种方法,第一种成功了,但是时间比较长

  1. 我使用 pandas.Series.str.strip 将对象 % 从 say '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' object has no attribute 'strip'

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

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

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

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

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

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