Установить правило для импорта текстовых данных в виде панд данных - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть следующий файл .txt:

945       21/01/2019                   -12,47       TRANSACTION 1        10,97000 IN  GBP  1,13674 %   

945       21/01/2019                   -14,47       TRANSACTION 2        10,97000 IN  GBP  1,13674 %   

(...)

И я хотел бы импортировать его в Python как Pandas Dataframe , в котором:

каждая строкаявляется транзакцией, и столбец определяется , если между символами более 2 пробелов ;

print(final_df)
Col_1      Col_2                        Col_3           Col_4               Col_5           Col_6
945       21/01/2019                   -12,47       TRANSACTION 1        10,97000 IN  GBP  1,13674 %  

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Pandas очень хорош в обработке данных, а не для декодирования данных, которые плохо отформатированы, как вы показали (более одного пробела в качестве разделителя, каждая вторая строка пуста).

Пуленепробиваемым способом было быфильтруйте входные данные и используйте модуль csv для анализа результата, потому что он принимает итератор в качестве входных данных (в то время как pd.read_csv нет).

Так что это должно сделать работу:

import csv
import re
import pandas as pd

def filter(fd):
    """Cleaning filter.

Will replace sequences of more that one space with a single tab, to process the
file as as tsv, and filter out empty lines
"""
    rx = re.compile('\s\s+')      # the pretended delimiter
    for line in fd:
        line = line.strip()       # clean out end of line
        if len(line) == 0:      
            continue              # filter out empty lines
        yield rx.sub('\t', line)  # and return non empty lines properly delimited

df = pd.DataFrame(list(csv.reader(filter(open('infile.txt'), delimiter='\t')))
print(df)

выдаст:

     0           1       2    ...                4    5          6
0  945  21/01/2019  -12,47    ...      10,97000 IN  GBP  1,13674 %
1  945  21/01/2019  -14,47    ...      10,97000 IN  GBP  1,13674 %

[2 rows x 7 columns]
0 голосов
/ 03 февраля 2019

Вы можете попробовать использовать пробел \s+ в качестве разделителя

df = pd.read_csv(r'C:\Users\1124612\Desktop\text.txt',sep='\s+',header = None)
df

Out:

    0   1   2   3   4   5   6   7   8   9
0   945 21/01/2019  -12,47  TRANSACTION 1   10,97000    IN  GBP 1,13674 %
1   945 21/01/2019  -14,47  TRANSACTION 2   10,97000    IN  GBP 1,13674 %
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...