所以我正在练习数据整理,并且遇到了问题。
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.]
谁能帮我弄清楚为什么小数会丢失,以及如何保留它们?
您必须编写一个函数来分隔包含 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)