2017-03-02 4 views
0

私は一緒にマージしようとしている3つのCSVを持っています。 3つのCSVにはさまざまな列の範囲がありますが、3つの列の間に一貫性のある列があります。選択した列のみを使用してCSVをマージする

これらの列の列ヘッダーは、Pythonリストに文字列として格納されています。これらの列は、マージしたい唯一のものです。サイドノートとして


、私はエラーメッセージ

'CSVDataSource' object has no attribute 'field_names' 

が供給していますけれども、私は、これは簡単に行うことができることを感じbreweryと呼ばれるライブラリを使用してthis threadanswerを実装しようとしてきましたCSVモジュールを使用していますが、正しい列の各CSVを検索してそれらの列のみをマージする方法は不明です。私がアプローチする方法が不明な別の問題は、マージされたCSV全体の各列の正しい配置を保証することです。 IEのcolumnAが1番目のCSVで5番目で、2番目のCSVで4番目の場合は、どのようにそれらがマージされたCSVの同じ位置にあることを確認しますか?

私はPython 2.7を使用していますが、残念ながらPandasにアクセスすることはできません。

コード例:

Columns_to_Merge = ['ColumnA','ColumnB','ColumnC'] 

# CSV1 

ColumnA,ColumnB,ColumnF,ColumnC 
2,3,4,9 
8,2,5,7 
1,2,3,4 

# CSV2 

ColumnD,ColumnA,ColumnC,ColumnB,ColumnH 
2,3,4,9,12 
8,2,5,7,2 
1,2,3,4,5 

# CSV3 

ColumnH,ColumnJ,ColumnA,ColumnB,ColumnC 
2,3,4,99,12 
8,5,5,7,2 
1,55,3,70,5 
+2

開始できる[最小動作例](https://stackoverflow.com/help/mcve)を入力してください。 – languitar

+0

各csvファイルの最初の行を読み取って、列の位置、つまりインデックスを特定できます。あなたが検索する値を知っている位置を知っている。 – elena

答えて

0

パンダを使用することはできませんので、以下のように、私はnumpyの使用します。

# first get all the columns of each csv file as lists 
csv1_cols = ['ColumnA','ColumnB','ColumnF','ColumnC'] 
csv2_cols = ['ColumnD','ColumnA','ColumnC','ColumnB','ColumnH'] 
csv3_cols = ['ColumnH','ColumnJ','ColumnA','ColumnB','ColumnC'] 

# then get the indices of the columns that you want to keep 
idxs_colA = [csv1_cols.index('ColumnA'), csv2_cols.index('ColumnA'), csv3_cols.index('ColumnA')] 
idxs_colB = [csv1_cols.index('ColumnB'), csv2_cols.index('ColumnB'), csv3_cols.index('ColumnB')] 
idxs_colC = [csv1_cols.index('ColumnC'), csv2_cols.index('ColumnC'), csv3_cols.index('ColumnC')] 

# get the columns as vectors and flatten them 
colA = np.array([csv1[:,idxs_colA[0]], csv2[:,idxs_colA[1]], csv3[:,idxs_colA[2]]]).flatten() 
colB = np.array([csv1[:,idxs_colB[0]], csv2[:,idxs_colB[1]], csv3[:,idxs_colB[2]]]).flatten() 
colC = np.array([csv1[:,idxs_colC[0]], csv2[:,idxs_colC[1]], csv3[:,idxs_colC[2]]]).flatten() 

# finally, create a new np array (with the cols in the order you want) 
# and transpose it 
new_csv = np.array([colA, colB, colC]).T 

かなり醜いを、それが動作します。

+0

ありがとう! 変数csv1、csv2、およびcsv3はそれぞれのcsvのファイル名にする必要がありますか? さらに、変数 'new_csv'を使ってCSVファイルとしてエクスポートするにはどうしたらいいですか? – Jamie2483

+0

csv1、csv2、およびcsv3には、csvファイルのデータが含まれている必要があります。 csvファイルを以下のようにnumpy配列に読み込むことができます: 'csv1 = np.genfromtext( 'my_csv1.csv'、delimiter = '、')'。次に、 'new_csv'を' np.savetxt( 'my_new_csv.csv'、new_csv、delimiter = '、') 'のようなファイルに書くことができます。 – TasosGlrs

+0

データが整数だけの場合は、整数として保存すると便利です。これを行うには、この 'fmt = '%i''引数を' np.savetxt() 'の中に加えてください。 – TasosGlrs

関連する問題