Ошибка загрузки набора данных Python - PullRequest
0 голосов
/ 14 мая 2018

Мне нужны некоторые знания о том, как исправить ошибку, которую я сделал при сборе данных. Собранные данные имеют следующую структуру:

["Author", "Message"]
["littleblackcat", " There's a lot of redditors here that live in the area maybe/hopefully someone saw something. "]
["Kruse", "In other words, it's basically creating a mini tornado."]

Обычно я бы не добавил "[" или "]" в файл .txt при записи данных в него, строка за строкой. Однако ошибка была допущена, поэтому при загрузке файла он будет отделен следующим образом:

Pandas Data

Есть ли способ правильно загрузить данные в панды?

Ответы [ 5 ]

0 голосов
/ 14 мая 2018

Вот еще несколько вариантов, чтобы добавить к смеси:

  1. Вы можете самостоятельно проанализировать строки, используя ast.literal_eval, а затем загрузить их в pd.DataFrame напрямую, используя итератор для строк:

    import pandas as pd
    import ast
    with open('data', 'r') as f:
        lines = (ast.literal_eval(line) for line in f)
        header = next(lines)
        df = pd.DataFrame(lines, columns=header)
        print(df)
    

    Обратите внимание, однако, что вызов ast.literal_eval один раз для каждой строки может быть не очень быстрым, особенно если в вашем файле данных много строк. Однако, если файл данных не слишком большой, это может быть приемлемым, простым решением.

  2. Другой вариант - заключить произвольный итератор (который дает bytes) в IterStream. Этот очень общий инструмент ( благодаря Mechanical snail ) позволяет вам манипулировать содержимым любого файла, а затем переупаковывать его в файлоподобный объект. Таким образом, вы можете исправить содержимое файла и, тем не менее, передать его любой функции, которая ожидает файловый объект, такой как pd.read_csv. (Примечание: я ответил на аналогичный вопрос, используя тот же инструмент, здесь .)

    import io
    import pandas as pd
    
    def iterstream(iterable, buffer_size=io.DEFAULT_BUFFER_SIZE):
        """
        http://stackoverflow.com/a/20260030/190597 (Mechanical snail)
        Lets you use an iterable (e.g. a generator) that yields bytestrings as a
        read-only input stream.
    
        The stream implements Python 3's newer I/O API (available in Python 2's io
        module).
    
        For efficiency, the stream is buffered.
        """
        class IterStream(io.RawIOBase):
            def __init__(self):
                self.leftover = None
            def readable(self):
                return True
            def readinto(self, b):
                try:
                    l = len(b)  # We're supposed to return at most this much
                    chunk = self.leftover or next(iterable)
                    output, self.leftover = chunk[:l], chunk[l:]
                    b[:len(output)] = output
                    return len(output)
                except StopIteration:
                    return 0    # indicate EOF
        return io.BufferedReader(IterStream(), buffer_size=buffer_size)
    
    def clean(f):
        for line in f:
            yield line.strip()[1:-1]+b'\n'
    
    with open('data', 'rb') as f:
        # https://stackoverflow.com/a/50334183/190597 (Davide Fiocco)
        df = pd.read_csv(iterstream(clean(f)), skipinitialspace=True, quotechar='"')
        print(df)
    
0 голосов
/ 14 мая 2018

На данный момент найдено следующее решение:

sep = '[|"|]'

Использование многосимвольного разделителя позволило хранить скобки в разных столбцах в кадре данных pandas, которые затем отбрасывались.Это позволяет избежать необходимости разбивать слова на строку.

0 голосов
/ 14 мая 2018

Рассмотрим код ниже, который читает текст в myfile.text, который выглядит следующим образом:

["Author", "Message"]
["littleblackcat", " There's a lot of redditors here that live in the area maybe/hopefully someone saw something. "]
["Kruse", "In other words ,it's basically creating a mini tornado."]

Приведенный ниже код удаляет [ и ] из text, а затем разбивает каждую строку в списке строк на ,, исключая первую строку, которая является заголовком. Некоторые Message содержат ,, что вызывает другой столбец (NAN в противном случае), и, следовательно, код переносит их в одну строку, которая и предназначена. Код:

 with open('myfile.txt', 'r') as my_file:
    text = my_file.read()
    text = text.replace("[", "")
    text = text.replace("]", "")

df = pd.DataFrame({
    'Author': [i.split(',')[0] for i in text.split('\n')[1:]],
    'Message': [''.join(i.split(',')[1:]) for i in text.split('\n')[1:]]
}).applymap(lambda x: x.replace('"', ''))

Выход:

    Author                             Message
0   littleblackcat    There's a lot of redditors here that live in the area  maybe/hopefully someone saw something. 
1   Kruse             In other words it's basically creating a mini tornado.
0 голосов
/ 14 мая 2018

Чистый вариант панд - изменить разделитель с , на ", ", чтобы иметь только 2 столбца, а затем удалить ненужные символы, которые, на мой взгляд, [, ], " и пробел:

import pandas as pd
import io
string = '''
["Author", "Message"]
["littleblackcat", " There's a lot of redditors here that live in the area maybe/hopefully someone saw something. "]
["Kruse", "In other words, it's basically creating a mini tornado."]
'''

df = pd.read_csv(io.StringIO(string),sep='\", \"', engine='python').apply(lambda x: x.str.strip('[\"] '))
# the \" instead of simply " is to make sure python does not interpret is as an end of string character
df.columns = [df.columns[0][2:],df.columns[1][:-2]]

print(df)
# Output (note the space before the There's is also gone
#            Author                                            Message
# 0  littleblackcat  There's a lot of redditors here that live in t...
# 1           Kruse  In other words, it's basically creating a mini...
0 голосов
/ 14 мая 2018

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

  1. Очистить квадратные скобки (с sed в командной строке Linux, но это может быть сделано, например, с помощью текстового редактора или в Python, если необходимо)

    sed -i 's/^\[//g' test.txt # remove left square brackets assuming they are at the beginning of the line
    sed -i 's/\]$//g' test.txt # remove right square brackets assuming they are at the end of the line
    
  2. Загрузка кадра данных (в консоли Python)

    import pandas as pd
    pd.read_csv("test.txt", skipinitialspace = True, quotechar='"')
    

(хотя не уверен, что это будет работать для всего вашего файла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...