Python处理腿部不对称数据集:将L值转负值、R值转正值
腿不对称数据正负转换问题解决
问题
我有一套左右腿不对称数据的数据集,为了可视化需要,想把左腿(标记'L')对应的数据转为负值,右腿(标记'R')对应的数据转为正值。
尝试了以下代码:
df_selection['Asymmetry)'] = df_selection['Assymetry'].str.replace('R','+').replace('L','-')
但存在两个问题:符号会被加到数字后面,且只有'R'能被替换,'L'的替换不生效。期望输出格式如下:
| Asymmetry |
|---|
| 1.3 |
| 2.5 |
| -3.1 |
注:原数据集的Assymetry列内容格式为R1.3、R2.5、L3.1这类形式。
解决方案
方案1:拆分符号与数值后计算
先分离侧别标记和数值,再根据侧别赋予正负:
# 提取侧别(首字符) df_selection['side'] = df_selection['Assymetry'].str[0] # 提取数值部分并转为浮点数 df_selection['value'] = df_selection['Assymetry'].str[1:].astype(float) # 生成目标列 df_selection['Asymmetry'] = df_selection.apply(lambda x: x['value'] if x['side'] == 'R' else -x['value'], axis=1) # 清理中间列(可选) df_selection = df_selection.drop(['side', 'value'], axis=1)
方案2:正则匹配转换
用正则提取侧别和数值,直接返回带正负的数值:
import re def convert_val(s): match = re.match(r'([RL])([\d.]+)', s) if match: side, num = match.groups() return float(num) if side == 'R' else -float(num) return s # 处理非预期格式的行 df_selection['Asymmetry'] = df_selection['Assymetry'].apply(convert_val)
方案3:正则替换调整格式
通过正则替换直接将侧别标记转为前置的正负号,再转数值类型:
# 替换R开头的内容,将R转为前置+号 df_selection['Asymmetry'] = df_selection['Assymetry'].str.replace(r'^R([\d.]+)', r'+\1') # 替换L开头的内容,将L转为前置-号 df_selection['Asymmetry'] = df_selection['Asymmetry'].str.replace(r'^L([\d.]+)', r'-\1') # 转为浮点数类型 df_selection['Asymmetry'] = df_selection['Asymmetry'].astype(float)
以上三种方法都能得到你需要的格式,方便后续做可视化图表。
内容的提问来源于stack exchange,提问作者Markus Fürst
相关产品推荐
相关产品推荐

