2014-10-17 318 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

相關問題