以文件名作为列标题将多个 *.txt 文件读入 Pandas Dataframe

Posted

技术标签:

【中文标题】以文件名作为列标题将多个 *.txt 文件读入 Pandas Dataframe【英文标题】:Read multiple *.txt files into Pandas Dataframe with filename as column header 【发布时间】:2014-12-12 11:58:48 【问题描述】:

我正在尝试导入一组 *.txt 文件。我需要将文件导入 Python 中 Pandas DataFrame 的连续列中。

要求和背景信息:

    每个文件都有一列数字 文件中没有标题 可以是正整数和负整数 所有 *.txt 文件的大小相同 DataFrame 的列必须以文件名(不带扩展名)作为标题 文件数量无法提前知道

这是一个示例 *.txt 文件。其他所有格式都相同。

16
54
-314
1
15
4
153
86
4
64
373
3
434
31
93
53
873
43
11
533
46

这是我的尝试:

import pandas as pd
import os
import glob

# Step 1: get a list of all csv files in target directory
my_dir = "C:\\Python27\Files\\"
filelist = []
filesList = []
os.chdir( my_dir )

# Step 2: Build up list of files:
for files in glob.glob("*.txt"):
    fileName, fileExtension = os.path.splitext(files)
    filelist.append(fileName) #filename without extension
    filesList.append(files) #filename with extension

# Step 3: Build up DataFrame:
df = pd.DataFrame()
for ijk in filelist:
    frame = pd.read_csv(filesList[ijk])
    df = df.append(frame)
print df

第 1 步和第 2 步有效。我在第 3 步遇到问题。我收到以下错误消息:

Traceback (most recent call last):
  File "C:\Python27\TextFile.py", line 26, in <module>
    frame = pd.read_csv(filesList[ijk])
TypeError: list indices must be integers, not str

问题: 有没有更好的方法将这些 *.txt 文件加载到 Pandas 数据框中?为什么 read_csv 不接受文件名字符串?

【问题讨论】:

在你的 for 循环中使用 frame = pd.read_csv(ijk) 而不是这个 frame = pd.read_csv(filesList[ijk]) 【参考方案1】:

您可以将它们读入多个数据帧,然后将它们连接在一起。假设您有其中两个文件,其中包含显示的数据。

In [6]:
filelist = ['val1.txt', 'val2.txt']
print pd.concat([pd.read_csv(item, names=[item[:-4]]) for item in filelist], axis=1)
    val1  val2
0     16    16
1     54    54
2   -314  -314
3      1     1
4     15    15
5      4     4
6    153   153
7     86    86
8      4     4
9     64    64
10   373   373
11     3     3
12   434   434
13    31    31
14    93    93
15    53    53
16   873   873
17    43    43
18    11    11
19   533   533
20    46    46

【讨论】:

对不起,我忘了提:有很多文件可能 >20。我强烈希望避免手动阅读它们。另外,我不明白这部分:“names=[item[:-4]”。 -4的意义是什么? 您可以使用os.listdir(PATH) 来获取PATH 中所有文件的列表,因此这部分很容易。至于names=item[:-4]:文件以'.txt' 结尾,你不希望'.txt' 成为列名的一部分,对吧? 谢谢。我尝试了这种方法: 第 1 行 - df = pd.DataFrame() 第 2 行 - 对于 filesList 中的项目:第 3 行 - df = pd.concat(pd.read_csv(item, names=[item[:-4]]),轴 = 1)。但它给出了一条错误消息:“TypeError: first argument must be a list-like of pandas objects, you pass a object of type “DataFrame”. 这种方法不起作用有什么原因吗? CT Zhu 的代码正在运行,但我不明白为什么我在上面评论中的方法不起作用。他的方法使用列表理解。我只是使用了一个简单的 for 循环。你能告诉我为什么我的方法行不通吗? 谢谢!请注意,就我而言,我想通过连接行(而不是列)来堆叠这些数据帧,因此我将 axis=1 替换为 axis=0, ignore_index=True【参考方案2】:

你很亲密。 ijk 已经是文件名了,你不需要访问列表:

# Step 3: Build up DataFrame:
df = pd.DataFrame()
for ijk in filelist:
    frame = pd.read_csv(ijk)
    df = df.append(frame)
print df

以后,请按原样提供工作代码。你导入from pandas import * 然后将pandas 称为pd,这意味着导入import pandas as pd

您还需要注意变量名。 files实际上是单个文件路径,filelistfilesList与变量名没有明显区别。将个人文档保存在 python 目录中似乎也是一个坏主意。

【讨论】:

很抱歉与 Pandas 命令混淆 - 是的,应该更正。我已经更新了原始帖子。

以上是关于以文件名作为列标题将多个 *.txt 文件读入 Pandas Dataframe的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个(excel)文件读入R? [复制]

如果列值取决于文件路径,有没有办法在一次读取多个文件时将文字作为列添加到 spark 数据框中?

python读入一个txt并将其中的数据按行依次保存成若干个txt文本并以每一行的前4个字符作为新txt的文件名。

linux中怎么将文件合并

如何将文件中的特定信息读入结构

将文件读入以逗号和换行符分隔的向量