Есть ли в python pandas способ сделать «Текст в столбцы» по местоположению (не через разделитель), как в Excel? - PullRequest
0 голосов
/ 04 мая 2020

Я использую данные истории голосования от Государственного секретаря, однако предоставленный мне текстовый файл содержит 7 миллионов строк, где каждая строка представляет собой строку из 27 символов. Первые 3 символа - это код графства. Следующие 8 символов - это регистрационный номер, следующие 8 символов - дата голосования и т. Д. c. Я не могу сделать текст в столбцы в Excel, потому что файл слишком большой. Есть ли способ разделить этот файл на столбцы в python pandas?

Пример

В настоящее время у меня есть:

0010000413707312012026R

0010000413708212012027R

0010000413711062012029

0010004535307312012026D

Я хочу иметь столбцы:

001 00004137 07312012 026 R

001 00004137 08212012 027 R

001 00004137 11062012 029

001 00045353 07312012 026 D

Где каждый пробел отделяет новый столбец. Какие-либо предложения? Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

попробуйте это: я думаю, что у вас нет проблемы с чтением формы txt файл, упрощенный регистр будет выглядеть так:

a=['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D']
area=[]
date=[]
e1=[]
e2=[]
e3=[]
#001 00004137 07312012 026 R
for i in range (0,len(a)):
    area.append(a[i][0:3])
    date.append(a[i][3:11])
    e1.append(a[i][11:19])
    e2.append(a[i][19:22])
    e3.append(a[i][22:23])


all_list = pd.DataFrame(
    {'area': area,
     'date': date,
     'e1': e1,
     'e2': e2,
     'e3': e3   
    })
print(all_list )
#save as CSV file
all_list.to_csv('all.csv')
0 голосов
/ 04 мая 2020

Проще всего это сделать:

import pandas as pd

sample_lines = ['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D]']

COLUMN_NAMES = ['A','B','C','D','E']
df = pd.DataFrame(columns=COLUMN_NAMES)
for line in sample_lines:
    row = [line[0:3], line[3:11], line[11:19], line[19:22], line[22:23]]
    df.loc[len(df)] = row

print (df)

Выходы:

     A         B         C    D  E
0  001  00004137  07312012  026  R
1  001  00004137  08212012  027  R
2  001  00004137  11062012  029   
3  001  00045353  07312012  026  D
0 голосов
/ 04 мая 2020

Поскольку файл слишком большой, его лучше читать и сохранять в другом файле, а не читать весь файл в памяти:

with open('temp.csv') as f:
    for line in f:
        code = line[0:3]
        registration = line[3:11]
        date = line[11:19]
        second_code = line[19:22]
        letter = line[22:]
        with open('modified.csv', 'a') as f2:
            f2.write(
                ' '.join([code, registration, date, second_code, letter]))

Вы также можете прочитать содержимое из txt файл и используйте extract для разделения столбцов данных

df = pd.read_csv('temp.csv', header=None)
df

#       0
# 0 0010000413707312012026R
# 1 0010000413708212012027R
# 2 0010000413711062012029
# 3 0010004535307312012026D

df = df[df.columns[0]].str.extract('(.{3})(.{8})(.{8})(.{3})(.*)')
df
#   0   1           2           3   4
# 0 001 00004137    07312012    026 R
# 1 001 00004137    08212012    027 R
# 2 001 00004137    11062012    029 
# 3 001 00045353    07312012    026 D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...