我有一个 pandas 数据框,其中一些行数据以数字结尾,我需要拆分这些行中的结尾数字,然后仅将它们移至右列。
下面是一个样本 df:
check_df = pd.DataFrame({
'Test': ["Absolute Neutrophil Count","Absolute Lymphocyte Count 2.9","Absolute Neutrophil Count"],
'Result1': [6.56,2.8,5.5],
'Result2': [5.14,2.6,4.8],
'Result3': [4.69,"10~9/L",5.2],
'Unit': ["10~9/L","1.0-3.0","10~9/L"],
'Range': ["4.0-10.0",None,"4.0-10.0"]
})
check_df
Test Result1 Result2 Result3 Unit Range
0 Absolute Neutrophil Count 6.56 5.14 4.69 10~9/L 4.0-10.0
1 Absolute Lymphocyte Count 2.9 2.80 2.60 10~9/L 1.0-3.0 None
2 Absolute Neutrophil Count 5.50 4.80 5.2 10~9/L 4.0-10.0
我尝试了下面的正则表达式代码来找出以数字结尾的“测试”行:
check_df.iloc[:,0].str.contains(r'\d+$')
期望的结果:
Test Result1 Result2 Result3 Unit Range
0 Absolute Neutrophil Count 6.56 5.14 4.69 10~9/L 4.0-10.0
1 Absolute Lymphocyte Count 2.9 2.80 2.60 10~9/L 1.0-3.0
2 Absolute Neutrophil Count 5.50 4.80 5.2 10~9/L 4.0-10.0
疑问: 但我不确定如何仅基于 index 或其他方法 split 那些行,以便所有行/列数据都可以采用正确对齐的数据表格式。
也就是说,您可以
extract
数字并使用
notna
识别不正确的行,然后使用
shift
和
update
:
tmp = check_df.iloc[:,0].str.extract(r'^(.*?)\s*(\d\.?\d*)?$')
out = check_df.copy()
out.update(check_df.assign(Test=tmp[1]).loc[tmp[1].notna()].shift(axis=1))
out['Test'] = tmp[0]
输出:
Test Result1 Result2 Result3 Unit Range
0 Absolute Neutrophil Count 6.56 5.14 4.69 10~9/L 4.0-10.0
1 Absolute Lymphocyte Count 2.9 2.80 2.6 10~9/L 1.0-3.0
2 Absolute Neutrophil Count 5.5 4.80 5.2 10~9/L 4.0-10.0
请注意,这不会神奇地修复数据类型。