2017-10-30 16 views
3

私は単一のパンダのデータフレームに読みたいファイルがたくさんあります。サンプルファイルは次のようになります。パンダ:異なる順序で複数のファイルを読む

variable_1_name 
variable_2_name 
... 
variable_n_name 
0.0 0.5 0.3 ... 0.8 
... 
1.0 4.5 6.5 ... 1.0 

ので、ファイルはファイルの先頭に変数名のリスト(1行に1つずつ)があり、その後、データはn値をスペース区切りの表に提示されています行ごとに。

問題がいくつかあります:

1)各ファイル内の変数の異なる数があります。すべての変数が各ファイルに存在するわけではありません。

2)ファイル間で変数の順序が異なる場合があります。

ファイル間の正しいデータを一致させながら、このデータをすべてpanadasデータフレームに読み込むにはどうすればよいですか?

答えて

2

Pal」を拡張最高の方法はcsvファイルからデータを読み取ることです。だから、ファイルをCSVファイルに変換しないでください(またはメモリ内に存在するCSVファイルのようなオブジェクトも)。pandasは汚い作業をしますか?あなたはThom Ives「答えからサンプルファイルを試してみる場合は

try: 
    import io # python3 
except ImportError: 
    import cStringIO as io # python2 
import pandas as pd 

DELIMITER = ',' 

def pd_read_chunk(file): 
    """ 
    Reads file contents, converts it to a csv file in memory 
    and imports a dataframe from it. 
    """ 
    with open(file) as f: 
     content = [line.strip() for line in f.readlines()] 
     cols = [line for line in content if ' ' not in line] 
     vals = [line for line in content if ' ' in line] 
     csv_header = DELIMITER.join(cols) 
     csv_body = '\n'.join(DELIMITER.join(line.split()) for line in vals) 
     stream = io.StringIO(csv_header + '\n' + csv_body) 
     return pd.read_csv(stream, sep=DELIMITER) 


if __name__ == '__main__': 
    files = ('file1', 'file2',) 
    # read dataframe from each file and concat all resulting dataframes 
    df_chunks = [pd_read_chunk(file) for file in files] 
    df = pd.concat(df_chunks) 
    print(df) 

、スクリプトが

 A B C D E 
0 1.0 2.0 3.0 NaN NaN 
1 1.1 2.1 3.1 NaN NaN 
0 NaN 2.2 NaN 4.2 5.2 
1 NaN 2.3 NaN 4.3 5.3 

編集戻ります:実際に、私たちは、カンマ区切り文字を必要としない - 私たちはすることができますスペースをデリミタとして再利用することで、コンパクト化と同時に変換を高速化できます。上記のもののアップデート版で、コードが少なく、実行速度が速いです:

try: 
    import io # python3 
except ImportError: 
    import cStringIO as io # python2 
import pandas as pd 


def pd_read_chunk(file): 
    """ 
    Reads file contents, converts it to a csv file in memory 
    and imports a dataframe from it. 
    """ 
    with open(file) as f: 
     content = [line.strip() for line in f.readlines()] 
     cols = [line for line in content if ' ' not in line] 
     vals = [line for line in content if ' ' in line] 
     csv_header = ' '.join(cols) 
     csv_lines = [csv_header] + vals 
     stream = io.StringIO('\n'.join(csv_lines)) 
     return pd.read_csv(stream, sep=' ') 


if __name__ == '__main__': 
    files = ('file1', 'file2',) 
    # read dataframe from each file and concat all resulting dataframes 
    df_chunks = [pd_read_chunk(file) for file in files] 
    df = pd.concat(df_chunks) 
    print(df) 
1

簡単な解決策は、次のようにテキストファイルを編集し、それが彼の良い提案に言ったことパル行うことは容易ではありませんと仮定すると、

variable_1_name, variable_2_name, ..., variable_n_name 
0.0 0.5 0.3 ... 0.8 
... 
1.0 4.5 6.5 ... 1.0 

df = pd.read_csv('filename') 
1

をread_csv使用することです、あなたは2つの単純化されたデータファイルを持っていると言います:

data1.txt

A 
B 
C 
1.0 2.0 3.0 
1.1 2.1 3.1 

とdata2.txt

B 
D 
E 
2.2 4.2 5.2 
2.3 4.3 5.3 

1の使用次の2つの関数のようなものを)したいファイルを取得し、2)パンダのデータフレームにそれらを条件付ける:

出力
import pandas as pd 
import os 

def Get_Filtered_File_List(topDirectory, checkString = None): 
    fileList = [] 

    fileNamesList = os.listdir(topDirectory) 
    for fileName in fileNamesList: 
     if checkString == None or checkString in fileName: 
      fileList.append(fileName) 

    return fileList 

def Load_And_Condition_Files_Into_DF(fileList): 
    header = [] 
    arrayOfValues = [] 
    arrayOfDicts = [] 

    for file in fileList: 
     thisHeader = [] 
     with open(file,'r') as f: 
      arrayOfLines = f.readlines() 
      for line in arrayOfLines: 

       lineArray = line.split() 
       if len(lineArray) == 1: 
        thisHeader.append(lineArray[0]) 
       else: 
        arrayOfDicts.append({}) 
        for i in range(len(lineArray)): 
         arrayOfDicts[-1][thisHeader[i]] = lineArray[i] 

      header += thisHeader 

    # print arrayOfDicts 
    header = sorted(list(set(header))) 
    for dict in arrayOfDicts: 
     arrayOfValues.append([]) 
     for name in header: 
      try: 
       val = dict[name] 
       # print '\t', name, val 
       arrayOfValues[-1].append(val) 
      except: 
       # print '\t', name, None 
       arrayOfValues[-1].append(None) 
    table = [header] + arrayOfValues 
    # print table 
    return pd.DataFrame(table, columns=table.pop(0)) 


fileList = Get_Filtered_File_List('./','data') 
print Load_And_Condition_Files_Into_DF(fileList) 

 A B  C  D  E 
0 1.0 2.0 3.0 None None 
1 1.1 2.1 3.1 None None 
2 None 2.2 None 4.2 5.2 
3 None 2.3 None 4.3 5.3 
関連する問題