首页 > 解决方案 > 使用熊猫创建列后如何将“列”添加回txt文件?

问题描述

所以我有一个 .LAS 文件(它实际上作为 txt 文件工作)并将其转换为数据框。后来我创建了一个新列,其中包含有关数据框的一些重要信息。有没有办法像原来的一样重写 LAS 文件,但现在使用新列?

这是我的 LAS 文件的样子:

Text 1
Text 2
Text 3
Text 4
~A Stats1 Stats2 Stats3
     1       2     3
     6       6     7
     8       9     3

所以我设法以我想要的方式将文件转换为 DataFrame(没有标题和'~A'):

with open(r'C:...filename.las') as f:
    for l in f:
        if l.startswith('~A'):
            stats= l.split()[1:]
            break
    data = pd.read_csv(f, names=stats, sep='~A', engine='python')

data

Stats1 Stats2 Stats3 Numbers
  1       2      3      1
  6       6      7      2
  8       9      3      3

现在,假设我使用 numbers(1,2,3) 创建了一个新列 data['Numbers'],如果我设法将其重写回我的 LAS 文件,它应该是:

```
Text 1
Text 2
Text 3
Text 4
~A Stats1 Stats2 Stats3 Numbers
     1       2     3       1
     6       6     7       2
     8       9     3       3
```

任何人都知道我该怎么做?

如果我只是使用: np.savetxt('filename_edited.las', data, fmt="%s") ...我设法用我想要的数据获取新的 LAS 文件,但没有原始文件上的标题。

谢谢!

标签: pythonpandasdataframestrip

解决方案


读取文件的时候需要保存header,这样就可以回写了。否则就丢了。

要编写数据帧,您可以在写回标题文本后使用pandas.DataFrame.to_csv 。

with open('data.txt') as f:
    file_header = []
    for l in f:
        if l.startswith('~A'):
            stats= l.split()[1:]
            break
        else:
            file_header.append(l)

    data = pd.read_csv(f, names=stats, sep='\s+', engine='python')

#manipulate the dataframe to add a column or whatever
data['numbers'] = [1, 2, 3]

with open('data2.txt', 'w') as wf:
    data_str = data.to_csv(None)
    for l in file_header:
        wf.write(l)
    wf.write('~A')
    wf.write(data_str)

data2.txt看起来像:

Text 1
Text 2
Text 3
Text 4
~A,Stats1,Stats2,Stats3,numbers
0,1,2,3,1
1,6,6,7,2
2,8,9,3,3

to_csv默认情况下使用逗号分隔符,但您可以使用sep参数指定不同的分隔符。必须是长度为 1 的字符串。


推荐阅读