2016-05-13 2 views
1

ビットのピクルス、助けていただければ幸いです。 異なるヘッダー構造を持つ異なるCSVファイルを検証しようとしています。例えばtype1.csvヘッダを使用header = Noneの場合、pandasを使用してcsvファイル内のヘッダーを決定してください。

COL1|COL2|COL3|COL4 
A1|A2|A3|A4 
B1|B2|B3|B4 
C1|C2|C3|C4 
D1|D2|D3|D4 

を下記=なし

df = pd.read_csv(type1.csv, sep='|', header=None) 

私は列軸に置き換える発行することができるように微細である

#  0  1  2  3 
0 COL1 COL2 COL3 COL4 
1 A1 A2 A3 A4 
2 B1 B2 B3 B4 
3 C1 C2 C3 C4 
4 D1 D2 D3 D4 

をレンダリングしていませんインデックス0(col1、col2など)の場合

header = df.columns.values 

私はどれもが私にデータフレーム

#       0   1  2     3 
0     Datetime timezone source unique identifier 
1 Non Header Row Count = 4  NaN  NaN    NaN 
2      COL1  COL2 COL3    COL4 
3       A1  A2  A3     A4 
4       B1  B2  B3     B4 
5       C1  C2  C3     C4 
6       D1  D2  D3     D4 

を与えない=ヘッダと次のような構造

Datetime|timezone|source|unique identifier 
Non Header Row Count = 4 ||| 
COL1|COL2|COL3|COL4 
A1|A2|A3|A4 
B1|B2|B3|B4 
C1|C2|C3|C4 
D1|D2|D3|D4 

を持つ別のファイルtype2.csvを持っている場合は、私は実装したいのアプローチがにありますその後、任意の値COL1、COL2、COL3等を有しており、おそらくヘッドを使用して、そのインデックス上記値のデータフレームを分割する行を検索するために介して反復noneに設定ヘッダとデータフレームを読み取る(n)は、nはCOL1を含む行であり、 COL2などabovとは関係なくEその行(私はコンテンツの上にいくつかの分析を実行するために新しいデータフレームにこれを分割する予定)

例は

#       0   1  2     3 
0     Datetime timezone source unique identifier 
1 Non Header Row Count = 4  NaN  NaN    NaN 
#  0  1  2  3 
0 COL1 COL2 COL3 COL4 
1 A1 A2 A3 A4 
2 B1 B2 B3 B4 
3 C1 C2 C3 C4 
4 D1 D2 D3 D4 

を分割するには、これは、)(ISINを使用して達成できるだろうまたはisin()とregexまたはquery()の組み合わせ?私は似た例や質問を検索しましたが、きれいに動作するようにそれを把握することができませんでした(と私はまだパンダのドキュメントを把握するために取得しています)。

データ健全性チェックのためにCOL1、COL2、COL3行の上にデータを保存したいのでスキップローを避けたいので、ファイルを読み込んでヘッダ列の位置を決定する事前検証ステップを実行しますスキップローを使用してデータフレームとして読み取ることは最適なアプローチではありません。できれば

は、すべてのヘルプは大歓迎しました。質問が明確でないか、私が愚かな仮定をしている/悪いアプローチをしている場合は、お詫び申し上げます。 (:)建設的またはその他の)批判、フィードバックやアドバイス歓迎は

答えて

0

あなたが使用することができます。

import pandas as pd 
import io 

temp=u"""Datetime|timezone|source|unique identifier 
Non Header Row Count = 4 ||| 
COL1|COL2|COL3|COL4 
A1|A2|A3|A4 
B1|B2|B3|B4 
C1|C2|C3|C4 
D1|D2|D3|D4""" 
#after testing replace io.StringIO(temp) to filename 
df1 = pd.read_csv(io.StringIO(temp), sep="|") 
print df1 
        Datetime timezone source unique identifier 
0 Non Header Row Count = 4  NaN NaN    NaN 
1      COL1  COL2 COL3    COL4 
2       A1  A2  A3    A4 
3       B1  B2  B3    B4 
4       C1  C2  C3    C4 
5       D1  D2  D3    D4 

df2 = df1[2:] 
df2.columns = df1.loc[1,:] 
df2 = df2.reset_index(drop=True).rename_axis(None, axis=1) 
print df2 
    COL1 COL2 COL3 COL4 
0 A1 A2 A3 A4 
1 B1 B2 B3 B4 
2 C1 C2 C3 C4 
3 D1 D2 D3 D4 

print df1[:1] 
        Datetime timezone source unique identifier 
0 Non Header Row Count = 4  NaN NaN    NaN 

EDIT:

そしてあなたがcontainsで最初の列にCOL1をあるインデックスを見つけることができますboolean indexing

col = df1[df1.iloc[:,0].str.contains('COL1')].index.tolist()[0] 
print col 
1 

df2 = df1[col+1:] 
df2.columns = df1.loc[col,:] 
df2 = df2.reset_index(drop=True).rename_axis(None, axis=1) 
print df2 
    COL1 COL2 COL3 COL4 
0 A1 A2 A3 A4 
1 B1 B2 B3 B4 
2 C1 C2 C3 C4 
3 D1 D2 D3 D4 

print df1[:col] 
        Datetime timezone source unique identifier 
0 Non Header Row Count = 4  NaN NaN    NaN 
+0

これは非常にうまくいった。私はそんなことに近づくとは思わなかった。フィードバックとアドバイスをありがとう。私はこれを拡張し、追加のフィードバックを提供しようとします:) –

関連する問題