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

时间:2014-10-17 00:08:04

标签: python-2.7 csv text pandas dataframe

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

要求和背景信息:

  1. 每个文件都有一列数字
  2. 文件中没有标题
  3. 正负整数是可能的
  4. 所有* .txt文件的大小相同
  5. DataFrame的列必须具有文件名(不带扩展名)作为标题
  6. 提前知道文件数
  7. 这是一个示例* .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不接受文件名的字符串?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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目录中似乎也是一个坏主意。