Как добавить «столбец» обратно в текстовый файл после создания столбца с пандами? - PullRequest
0 голосов
/ 01 ноября 2019

Итак, у меня есть файл .LAS (он работает практически как текстовый файл), и я преобразовал его в формат данных. Позже я создал новый столбец с важной информацией о кадре данных. Есть ли способ переписать файл 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) и если мне удалось переписать это обратно в мой файл 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 с нужными мне данными, но без заголовка, который был у меня в исходном файле.

Спасибо!

1 Ответ

1 голос
/ 01 ноября 2019

Вам нужно сохранить заголовок при чтении файла, чтобы вы могли записать его обратно. В противном случае он теряется.

Чтобы записать фрейм данных, вы можете использовать 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.

...