2016-12-30 53 views
3

私はセントルイスフレッドから物価指数データの50個のcsvファイルを持って、それぞれのフォーマットはこのようなものです:csvファイルを結合し、ヘッダー行をPythonで追加するにはどうすればよいですか?

enter image description here

そして、私は、複数のCSVファイルを結合して、ヘッダーの1つの以上の行を追加したいですそれらは次の形式を達成するために:私は知っているかもしれない、だから私は1つのcsvファイルにデータを格納することができます

enter image description here

を私は、Pythonでそれを行うことができます任意の方法はありますか?

+0

これはPythonの 'csv'モジュールを使って行うことができます。例としてはGoogleだけで、使用方法についてはドキュメントを読んでください。 – sisanared

+0

あるいは、 'pandas.read_csv()'を使って各ファイルを読み込み、データフレームを連結して一つのデータフレームにマージします。 – DyZ

答えて

3

DATE欄の繰り返しは意味をなさない。特定の目的がない限り。また、マージしている間、特定の行のデータが同じ日付に属していることに注意してください。

そのより良いあなたがインデックスとしてDATEを使用してマージし、OUTER方法を使用してマージしている場合はパンダを使用します。したがって、同じ日付の値は同じ行にあります。

import pandas as pd; 

df1 = pd.read_table('file1.csv', sep=',') 
df2 = pd.read_table('file2.csv', sep=',') 
df3 = pd.read_table('file3.csv', sep=',') 

基本的に、データフレームとしてすべてのファイルを読み込みます。次に、mergeまたはreduce機能を使用してファイルをマージします。

data_frames = [df1, df2, df3] 

上記のコードには、いくつでもデータフレームを追加できます。

次に、それらをマージします。あなたはDATE

df_merged = reduce(lambda left,right: pd.merge(left,right,on=['DATE'], 
              how='outer'), data_frames) 

でそれをマージする必要が同じ日付に属している値を維持するために続いてCSVファイルにマージされたデータを書き込みます。

pd.DataFrame.to_csv(df_merged, 'merged.txt', sep=',', na_rep='.', index=False) 

これは

DATE VALUE1 VALUE2 VALUE3 ....

+0

ありがとうございます!!!!! –

+0

あなたは私の答えを受け入れることができますか? – everestial007

+0

、それをチェックしてください! –

1

パンダは素晴らしいソリューションですが、あなたを与える必要がありますが、PythonのSTD libにソリューションたい場合:

import csv 
from itertools import chain 

csv_input_filenames = [ 
    'csvfile1.csv', 
    'csvfile2.csv', 
    'csvfile3.csv', 
] 
csv_output_filename = 'csv_out.csv' 

# get the csv data 
csv_files = [open(file_name) for file_name in csv_input_filenames] 
csv_handles = [csv.reader(csv_file) for csv_file in csv_files] 
rows = (list(chain(*row)) for row in zip(*csv_handles)) 

# write combined output 
with open(csv_output_filename, 'wb') as csv_file: 
    filenames_header = list(chain(
     *zip(csv_input_filenames, [''] * len(csv_input_filenames)))) 

    csv_writer = csv.writer(csv_file) 
    csv_writer.writerow(filenames_header) 

    for row in rows: 
     csv_writer.writerow(row) 

# close input files 
for csv_file in csv_files: 
    csv_file.close() 
1

これが垂直のすべてのファイルを連結しますが提供されたディレクトリ(コードで指定する必要はありません)。ファイルは任意の数の列を持つことができ、値内のスペースを処理できます。ただし、ファイルの行数はすべて同じでなければなりません。

モジュールcsvとosだけを使用します。

import os 
import csv 

dir_base = r'H:\apps\xp\Desktop\localrepo\Temp' 
dir_name = '-test2' 
output_name = 'output.csv' 

path = os.path.join(dir_base, dir_name) 
out_path = os.path.join(dir_base, output_name) 


def _extend(lines, lineno, line): 
    try: 
     lines[lineno].extend(line) 
    except IndexError: 
     lines.append(line) 


def main(): 
    lines = [] 

    # read and generate new file 
    for root, dirs, files in os.walk(path): 
     for f in files: 
      with open(os.path.join(root, f), 'r') as csvfile: 
       f_in = csv.reader(csvfile) 
       for lineno, line in enumerate(f_in, start=1): 
        if lineno == 1: 
         header = [''] * len(line) 
         header[0] = f 
         _extend(lines, 0, header) 
        _extend(lines, lineno, line) 

    # print new file 
    with open(out_path, 'w', newline='\n') as csvfile: 
     csv.writer(csvfile).writerows(lines) 


if __name__ == '__main__': 
    main() 

出力は次のようになります。 enter image description here

あなたの「CSV」ファイルは、他の区切り文字(それゆえではない技術的には「C」SVファイル)を持っている場合は、単に区切りを示すためのコードcsv.reader(csvfile)のこの部分を変更します例えば、csv.reader(csvfile, delimiter='|')

希望すると助かります!

関連する問題