私はセントルイスフレッドから物価指数データの50個のcsv
ファイルを持って、それぞれのフォーマットはこのようなものです:csvファイルを結合し、ヘッダー行をPythonで追加するにはどうすればよいですか?
そして、私は、複数のCSVファイルを結合して、ヘッダーの1つの以上の行を追加したいですそれらは次の形式を達成するために:私は知っているかもしれない、だから私は1つのcsvファイルにデータを格納することができます
を私は、Pythonでそれを行うことができます任意の方法はありますか?
私はセントルイスフレッドから物価指数データの50個のcsv
ファイルを持って、それぞれのフォーマットはこのようなものです:csvファイルを結合し、ヘッダー行をPythonで追加するにはどうすればよいですか?
そして、私は、複数のCSVファイルを結合して、ヘッダーの1つの以上の行を追加したいですそれらは次の形式を達成するために:私は知っているかもしれない、だから私は1つのcsvファイルにデータを格納することができます
を私は、Pythonでそれを行うことができます任意の方法はありますか?
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 ....
パンダは素晴らしいソリューションですが、あなたを与える必要がありますが、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()
これが垂直のすべてのファイルを連結しますが提供されたディレクトリ(コードで指定する必要はありません)。ファイルは任意の数の列を持つことができ、値内のスペースを処理できます。ただし、ファイルの行数はすべて同じでなければなりません。
モジュール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()
あなたの「CSV」ファイルは、他の区切り文字(それゆえではない技術的には「C」SVファイル)を持っている場合は、単に区切りを示すためのコードcsv.reader(csvfile)
のこの部分を変更します例えば、csv.reader(csvfile, delimiter='|')
。
希望すると助かります!
これはPythonの 'csv'モジュールを使って行うことができます。例としてはGoogleだけで、使用方法についてはドキュメントを読んでください。 – sisanared
あるいは、 'pandas.read_csv()'を使って各ファイルを読み込み、データフレームを連結して一つのデータフレームにマージします。 – DyZ