したいこと
以下のようなcsvデータを読み込んだ後にいろいろ整形したいとしても,ヘッダーの数と各行のデータ数が合わない場合,うまく整形ができませんでした.
このような場合の対処のベストプラクティスがわからなくて無理やり対処しました.もしあれば教えていただきたいです.
id | mean | data | ||||
---|---|---|---|---|---|---|
1 | 0.5 | 0.75 | 0.40 | 0.55 | 0.39 | ... |
2 | 0.3 | 0.25 | 0.10 | 0.35 | 0.43 | ... |
... | ... | ... | ... | ... | ... | ... |
対処方法
誰もが思いつくことだと思うのですが,データはid列とmean列と複数のdata列が並べられているだけなので,headerを0に設定してnamesでヘッダーを無理やり上書きします.
そのためにお恥ずかしいですが以下のように2回データを取得して無理やりデータを整形し直して,得られたデータフレームに対して処理を加えます.データ数が多くなると同じことはできないと思うので,ベストプラクティスが知りたいです...
import pandas as pd
# csvの読み込み 1回目
# header=1にすることで一行目を無視しています.なので,この段階では2行目のデータがheaderの代わりになっています.
df_num = len(pd.read_csv('test.csv', header=1).columns)
# namesを作成します.ヘッダーは重複ができないので適当にindexをつけておきます
names = ['id', 'mean'] + ['data_%d'%(i+1) for i in range(df_num - 2)]
# csvの読み込み 2回目
# データを再度読み込みます.この際header=0としてnamesを上書きします.
df = pd.read_csv('test.csv', header=0, names=names)
上記のようにすることで,csvファイルのヘッダーを以下のように無理やり上書きしました.
id | mean | data_1 | data_2 | data_3 | data_4 | ... |
---|---|---|---|---|---|---|
1 | 0.5 | 0.75 | 0.40 | 0.55 | 0.39 | ... |
2 | 0.3 | 0.25 | 0.10 | 0.35 | 0.43 | ... |
... | ... | ... | ... | ... | ... | ... |
これで一応mean列を消したりと欲しいデータに整形することが容易にできます.
pandasを普段からゴリゴリにつかっていないので,なにか良い方法があればコメントいただけると幸いです.
ご覧いただき,ありがとうございました.