Pythonを利用してデータ分析を行なっています。
LightGBMライブラリを利用するにあたって、読み込ませるための設定ファイルを作成する必要があり、試行錯誤しているのですがうまくできないため質問させてください。
作りたいファイル例
(i)1要素目には機械学習のためのラベル
(ii)2要素目以降にて対応するカラム番号とその特徴量を列挙
(iii)各要素間はスペースでセパレート
txt
10 0:0.01 1:0.1 2:0.2 4:0.4 23 1:0.2 3:0.6 4:0.8 31 0:0.03 3:0.9 4...
現在の自分の作成例
(1)対応するようにデータフレームを作る
('NaN'としているのは、np.nanを使うとなぜか(2)がうまくいかないため。その理由も教えてもらえたら幸)
Python
1import numpy as np 2import pandas as pd 3 4df = pd.DataFrame({'label': [0, 3, 1], 5 '特徴量1': [0.01, 'NaN', 0.03], 6 '特徴量2': [0.1, 0.2, 'NaN'], 7 '特徴量3': [0.2, 'NaN', 'NaN'], 8 '特徴量4': ['NaN', 0.6, 0.9], 9 '特徴量5': [0.4, 0.8, 'NaN']}) 10 11df 12 13# <result> 14# label 特徴量1 特徴量2 特徴量3 特徴量4 特徴量5 15# 0 0 0.01 0.1 0.2 NaN 0.4 16# 1 3 NaN 0.2 NaN 0.6 0.8 17# 2 1 0.03 NaN NaN 0.9 NaN
(2)NaNを取り除いていい感じに1カラムに収める
Python
1label = df[['label']] 2tmp = df.drop(['label'], axis=1) 3tmp.columns = range(tmp.shape[1]) 4 5for c_n in tmp.columns: 6 tmp[c_n] = ['{0}:{1}'.format(c_n, v) if v != 'NaN' else 'NaN' for v in tmp[c_n]] 7res = pd.concat([label, tmp], axis=1) 8 9 10for i in range(res.shape[1]-1): 11 res['label'] = ['{0} {1}'.format(v1, v2) if v2 != 'NaN' else v1 for v1, v2 in zip(res['label'], res.iloc[:, i+1])] 12 13res[['label']] 14 15# <result> 16# label 17# 0 0 0:0.01 1:0.1 2:0.2 4:0.4 18# 1 3 1:0.2 3:0.6 4:0.8 19# 2 1 0:0.03 3:0.9
(3)最後にpandasのto_csvを使って、index,header,sepのオプションを設定する
Python
1res2 = res[['label']] 2res2.to_csv('sample.txt', sep=' ', index=False, header=False) 3# 追記:ここでのsepの設定は不要 4 5# <result> 6# "0 0:0.01 1:0.1 2:0.2 4:0.4" 7# "3 1:0.2 3:0.6 4:0.8" 8# "1 0:0.03 3:0.9"
課題として、最終的にpandasがobject型と認識して「"」で囲ってしまうようです..
毎回sedで処理するのも面倒ですしできればPythonスクリプト内で完結させたいのですが、
どのようにすればよいか教えてもらえないでしょうか。
お願いします。
回答2件
あなたの回答
tips
プレビュー