提取值时未获取小数

问题描述 投票:0回答:1

所以我正在练习数据整理,并且遇到了问题。

food['GPA'].unique()

输出是

array(['2.4', '3.654', '3.3', '3.2', '3.5', '2.25', '3.8', '3.904', '3.4',
       '3.6', '3.1', nan, '4', '2.2', '3.87', '3.7', '3.9', '2.8', '3',
       '3.65', '3.89', '2.9', '3.605', '3.83', '3.292', '3.35',
       'Personal ', '2.6', '3.67', '3.73', '3.79 btch', '2.71', '3.68',
       '3.75', '3.92', 'Unknown', '3.77', '3.63', '3.882'], dtype=object)

我的想法是先将它们转换为字符串,然后从中提取浮点数和整数。但是当我运行代码时

food['GPA'] = food['GPA'].astype(str).str.extract('(\d*\.\d+|\d+)', expand=False)
food['GPA'] = pd.to_numeric(food['GPA'], errors='coerce')

GPA 列中的所有值都将转换为 3.0 和 4.0,而不是保留其小数值。

food['GPA'].unique()
[3. 2. 4.]

谁能帮我弄清楚为什么小数会丢失,以及如何保留它们?

python pandas data-cleaning data-wrangling
1个回答
0
投票

您必须编写一个函数来分隔包含 NaN、字符串和数值的行。然后你可以使用正则表达式来获取包含字符串和数值的行中的数值。

def extract_digits(value):
    if pd.isna(value):
        return np.nan
    elif isinstance(value, str):
        match = re.search(r'\d+\.?\d*', value)
        return float(match.group()) if match else np.nan
    else:
        return value

df['GPA_new'] = df['GPA'].apply(extract_digits) 
© www.soinside.com 2019 - 2024. All rights reserved.