2016-10-04 33 views
-1

ディレクトリから12個の.txtファイルを抽出しようとしています。各ファイルには、抽出したい3列のデータ(X、Y、Z)が含まれています。私は1つのdf(InforDF)ですべてのデータを収集したいと思いますが、これまでは、同じ列にあるX、Y、Zのすべてのデータを含むdfを作成することに成功しました。これは私のコードです:複数のファイルからPythonでデータを抽出する

import pandas as pd 
import numpy as np 
import os 
import fnmatch 

path = os.getcwd() 

file_list = os.listdir(path) 

InfoDF = pd.DataFrame() 

for file in file_list: 
    try: 
     if fnmatch.fnmatch(file, '*.txt'): 
      filedata = open(file, 'r') 
      df = pd.read_table(filedata, delim_whitespace=True, names={'X','Y','Z'}) 

    except Exception as e: 
     print(e) 

私は間違っていますか?

+0

を移入するappendconcatを使用し、ループの前に空のデータフレームInfoDFを作成し、一般的に例外をキャッチしていないが(常にキャッチ特定のタイプの例外) –

+0

各繰り返しでdfを上書きしています –

答えて

1

私はconcatを使用し、その後list comprehensionDataFramesdfsのリストを作成し、すべてのファイルを選択するためにglobが必要だと思うし、:

files = glob.glob('*.txt') 
dfs = [pd.read_csv(fp, delim_whitespace=True, names=['X','Y','Z']) for fp in files] 

df = pd.concat(dfs, ignore_index=True) 
2
df = pd.read_table(filedata, delim_whitespace=True, names={'X','Y','Z'}) 

このラインなぜそれがだ、ループの各反復でdfを置き換えますあなたのプログラムの終わりに最後のものしか持っていない。あなたは何ができるか

は、リスト内のすべてのあなたのデータフレームを保存し、

df_list = [] 
for file in file_list: 
    try: 
     if fnmatch.fnmatch(file, '*.txt'): 
      filedata = open(file, 'r') 
      df_list.append(pd.read_table(filedata, delim_whitespace=True, names={'X','Y','Z'})) 
df = pd.concat(df_list) 

代わりに最後にそれらを連結することで、あなたはそれを書くことができます。

df_list = pd.concat([pd.read_table(open(file, 'r'), delim_whitespace=True, names={'X','Y','Z'}) for file in file_list if fnmatch.fnmatch(file, '*.txt')]) 
0
  • camilleriは、上記に言及したようループ内でdfを上書きしています
  • また、一般的な例外をキャッチするポイントはありません

ソリューション:発言として小さいdf

import pandas as pd 
import numpy as np 
import os 
import fnmatch 

path = os.getcwd() 

file_list = os.listdir(path) 

InfoDF = pd.DataFrame(columns={'X','Y','Z'}) # create empty dataframe 
for file in file_list: 
    if fnmatch.fnmatch(file, '*.txt'): 
     filedata = open(file, 'r') 
     df = pd.read_table(filedata, delim_whitespace=True, names={'X','Y','Z'}) 
     InfoDF.append(df, ignore_index=True) 
print InfoDF 
関連する問題