将文本文件中的数据导入 pandas 数据框

Posted

技术标签:

【中文标题】将文本文件中的数据导入 pandas 数据框【英文标题】:Import data from a text file into a pandas dataframe 【发布时间】:2019-09-01 11:23:00 【问题描述】:

我正在使用 Django 构建一个网络应用程序。我使用

上传了一个文本文件

csv_file = request.FILES['file'].

我无法将 csv 读入 pandas。我试图导入的文件有文本和数据,但我只想要数据。

我尝试了以下方法

    df = pd.read_csv(csv_file, sep=" ", header=None, names=["col1","col2","col3"], skiprows = 2) 尝试删除 cmets 并读取数字

错误:pandas 不会读取所有 3 列。它只读取 1 列

    我试过 df = pd.read_csv(csv_file, sep="\s2", sep=" ", header=None, names=["col1","col2","col3"], skiprows = 2) 尝试移除 cmets 并读取数字

错误:不能在类似字节的对象上使用字符串模式

    我尝试 df = pd.read_csv(csv_file.read(), sep=" ", header=None, names=["col1","col2","col3"], skiprows = 2) 尝试删除cmets,只需阅读数字

我上传的文件

% 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

【问题讨论】:

【参考方案1】:

这适用于您提供的数据,并为您提供您期望的数据框:

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

因为sep不止一个字符,所以需要使用python引擎而不是C引擎。 python 引擎有时会遇到引号问题,但你没有,所以没关系。您实际上甚至不需要指定 python 引擎,它会自动为您选择,但您会收到 stderr 的警告;指定引擎会抑制这种情况。

【讨论】:

当我有 sep = ' ' 时,我收到一个错误“不能在类似字节的对象上使用字符串模式”。当我有 sep = '\s+' 时,警告是“字符串中的异常反斜杠:'\s'。字符串常量可能缺少 r 前缀”,它给了我一个空的 DataFrame 在正则表达式中使用反斜杠时,需要使用原始文本,即 sep=r'\s+' 至于您的类似字节测试的对象,听起来您还没有将文件解码为文本格式。 您能告诉我如何将我的文件解码为文本格式吗?当我键入 csv_filepath.read() 时,类类型是“字节”。【参考方案2】:

您在描述点#2 中的方法几乎是正确的。另外,我的答案只是将正则表达式作为分隔符添加到@prooffreader 的答案中,因为它会使语句不易出错。

 df = pd.read_csv('file_path', sep="\s+",header=None, 
                    names=['col1', 'col2','col3'], skiprows=2)

【讨论】:

当我有 sep = ' ' 时,我收到一个错误“不能在类似字节的对象上使用字符串模式”。当我有 sep = '\s+' 时,警告是“字符串中的异常反斜杠:'\s'。字符串常量可能缺少 r 前缀”,它给了我一个空的 DataFrame 尝试使用分隔符 = r'\s+'。如果这不起作用,您能否发布您用于读取文件和文件的完整代码?理想情况下,您不应该收到这样的错误。 谢谢!有效。我不得不重新导入。那是错误

以上是关于将文本文件中的数据导入 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

Python - Pandas - 导入 Excel 文件,遍历每一行,添加新值,并添加到数据框

以科学记数法将带有科学记数法的文本文件读取到 pandas 数据框

比较季度数据:Python(Pandas) 中的迭代以比较来自作为数据框导入的四个不同 excel 文件的多列

将带有分组数据的 CSV 导入 Pandas 数据框 [重复]

我可以将 SQL Server (=MS SQL) 中的表导入 Python / Pandas 数据框吗?

将 Google 电子表格 CSV 导入 Pandas 数据框