2014-10-17 164 views
1

我试图导入一组* .txt文件。我需要将这些文件导入到Python中的Pandas DataFrame的连续列中。将多个* .txt文件读入Pandas Dataframe,并将文件名作为列标题

要求和背景资料:

  1. 每个文件都有一个号码列
  2. 没有头是存在于文件
  3. 正,负整数都是可能
  4. 的所有大小* .txt文件是相同的
  5. DataFrame的列必须具有文件的名称(不带扩展名)作为标头
  6. 提前未知文件数

这是一个* .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文件加载到数据帧的熊猫?为什么read_csv不接受文件名字符串?

回答

3

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

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 
+0

对不起,我忘了提及:有许多文件可能> 20。我强烈希望避免手动读取它们。另外,我不明白这个部分:“names = [item [: - 4]”。 -4的意义是什么? – 2014-10-17 00:39:02

+1

您可以使用'os.listdir(PATH)'来获取'PATH'中所有文件的列表,这样就很容易。至于,'names = item [: - 4]':文件以''.txt''结尾,你不希望''.txt''成为列名的一部分,对吧? – 2014-10-17 01:19:25

+0

谢谢。我尝试了这种方法:第1行 - df = pd.DataFrame()第2行 - 用于filesList中的项目:第3行 - df = pd.concat(pd.read_csv(item,names = [item [: - 4]])轴= 1)。但它给出了一个错误消息:“TypeError:第一个参数必须是像pandas对象一样的列表,你传递了一个类型为”DataFrame“的对象。有什么理由不采用这种方法? – 2014-10-17 01:54:01

1

你非常接近。 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目录中似乎也不是个好主意。

+0

对熊猫命令的困惑抱歉 - 是的,应该纠正。我已更新原始帖子。 – 2014-10-20 00:31:02

相关问题