我有一个.csv文件,如下所示:
X XB XC O P
A312 76.55 - - - -
B313 175.4 62.28 32.62 8.189 121.2
J314 176.5 53.34 40.77 8.277 124.6
L315 177.9 55.29 41.44 8.427 125.5
T316 174.7 59.47 63.43 8.264 116.1
...
G378 10.2 58.91 40.13 7.646 126.7
如您所见,定界符仅是空格,并非每一行都可用所有值。
我的目标是使用以下格式获取相同的确切数据:
312 A X 76.55
313 B X 175.4
313 B XB 62.28
313 B XC 32.62
...
378 G O 7.646
378 G P 126.7
直到现在,我设法用熊猫读取了文件并隔离了所有列:
import pandas as pd
raw_id = pd.read_csv("myfile.csv", delim_whitespace = True, header = None, skiprows = [0], usecols = [0], index_col = False)
# same lines, different usecols index for each column.
print(raw_id.to_string(index = False, header = False))
这是一个开始,但是我有两个大问题,我无法真正找到解决方案。
1)如何拆分A312,B313 ...,并按照上述新格式(即312A等)的指定重新表达它们?
2)如何将每个列值链接到其数字锚点,在列显示值的范围内重复整数,并在找到“-”时跳过?我猜这里需要一些for
循环,但是我无法处理。
非常感谢可以帮助完成此任务的人!
答案 0 :(得分:2)
首先删除缺失值:
import numpy as np
x = raw_id.replace('-', np.nan).stack().reset_index()
然后,分割名称:
x = x.join(x['level_0'].str.extract(r'(\D)(\d+)'), lsuffix='_')
最后,删除冗余列:
x.drop('level_0', axis=1, inplace=True)
# level_1 0_ 0 1
#0 X 76.55 A 312
#1 X 175.4 B 313
#2 XB 62.28 B 313
#3 XC 32.62 B 313
#4 O 8.189 B 313
#...
在将结果保存到CSV文件之前,您可能需要适当地重命名列。