Импортировать данные из текстового файла в фрейм данных Pandas - PullRequest
2 голосов
/ 11 апреля 2019

Я создаю веб-приложение, используя Django. Я загрузил текстовый файл, используя

csv_file = request.FILES ['file'].

Я не могу прочитать CSV в панд. Файл, который я пытаюсь импортировать, содержит текст и данные, но мне нужны только данные.

Я пробовал следующее

  1. df = pd.read_csv (csv_file, sep = "", header = None, names = ["col1", "col2", "col3"], skiprows = 2), чтобы попытаться удалить комментарии и просто прочитать число

Ошибка: панды не будут читать все 3 столбца. Он читает только 1 столбец

  1. Я пытался df = pd.read_csv (csv_file, sep = "\ s {2}", sep = "", header = None, names = ["col1", "col2", "col3"], skiprows = 2) попытаться удалить комментарии и просто прочитать цифры

Ошибка: нельзя использовать строковый шаблон для байтовоподобного объекта

  1. Я попытался df = pd.read_csv (csv_file.read (), sep = "", header = None, names = ["col1", "col2", "col3"], skiprows = 2), чтобы попытаться удалить комментируйте и просто читайте цифры

Файл, который я загрузил

% filename
% username
2.0000  117.441  -0.430
2.0100  117.499  -0.337
2.0200  117.557  -0.246
2.0300  117.615  -0.157
2.0400  117.672  -0.069

views.py

def new_measurement(request, pk):
    material = Material.objects.get(pk=pk)
    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save(commit=False)
            topic.material = material
            topic.message=form.cleaned_data.get('message')
            csv_file = request.FILES['file']
            df = genDataFrame(csv_file)
            topic.data = df
            topic.created_by = request.user
            topic.save()
            return redirect('topic_detail', pk =  material.pk)
    else:
        form = NewTopicForm()
    return render(request, 'new_topic.html', {'material': material, 'form': form})
def genDataFrame(csv_file):
    df = pd.read_csv(csv_file, sep=" ", header=None, names=["col1","col2","col3"])
    df = df.convert_objects(convert_numeric=True)
    df = df.dropna()
    df = df.reset_index(drop = True)
    return df_list

Я хочу получить фрейм данных типа

col1   col2     col3
2.0000  117.441  -0.430
2.0100  117.499  -0.337
2.0200  117.557  -0.246
2.0300  117.615  -0.157
2.0400  117.672  -0.069

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

У вас был почти правильный подход в описании пункта № 2.Кроме того, мой ответ просто добавляет регулярное выражение в качестве разделителя к ответу @ prooffreader, так как это сделает оператор менее подверженным ошибкам.

 df = pd.read_csv('file_path', sep="\s+",header=None, 
                    names=['col1', 'col2','col3'], skiprows=2)
0 голосов
/ 11 апреля 2019

Это работает с данными, которые вы предоставили, и дает ожидаемый вами фрейм данных:

df = pd.read_csv(csv_filepath, sep='  ', header=None, 
                 names=['col1', 'col2', 'col3'], skiprows=2, engine='python')

Поскольку sep - это более одного символа, вам нужно использовать движок python вместо движка C.У движка Python иногда возникают проблемы с кавычками, но у вас их нет, так что это нормально.На самом деле вам даже не нужно указывать движок python, он будет выбран автоматически, но вы получите предупреждение для stderr;указав двигатель подавляет это.

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