在.csv文件中复制数据以更改其格式

时间:2019-04-05 21:04:11

标签: python csv

我有一个.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循环,但是我无法处理。

非常感谢可以帮助完成此任务的人!

1 个答案:

答案 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文件之前,您可能需要适当地重命名列。