2016-06-14 8 views
1

私はパンダのデータフレームにインポートCSVファイルを持っています。おそらく、1対多の親テーブルと詳細テーブルを組み合わせたデータベースのエクスポートが原因でした。解析CSV(一対多unmunge)

header1, header2, header3, header4, header5, header6 

sample1, property1,,,average1,average2 
,,detail1,detail2,, 
,,detail1,detail2,, 
,,detail1,detail2,, 

sample2, ... 
,,detail1,detail2,, 
,,detail1,detail2,, 
... 

(すなわちline 0headerあるnスルーlines 2詳細、ラインであるN + 1 ...ようにレコード2であり、line 1record 1ある)

次のようにcsvファイルの形式であります

(再正規化?)sample#レコードに値を使用して参照することができ、別DataFramesに詳細救出するための最良の方法は何ですか?詳細の各サブセットの数は、サンプルごとに異なります。

私が使用することができます。

samplelist = df.header2[pd.notnull(df.header2)] 

を私はsamplelist.indexをつかむことができるように、各サンプルの開始インデックスを取得するには、[0] [1]をsamplelist.indexと小さなデータフレームでそれを置くために。それはcsvファイルの順番から推測する必要があるので、それ自体で詳細レコードは、サンプル彼らがどこから来たへの参照を持っていない(私の例では/満たされた空のフィールドのない交差点が存在しないことに注意してください)。

私はデータフレームのリスト、データフレームの辞書、またはデータフレームのパネルを作るべきか?

sample1レコードフィールドから何らかの変数を作成し、何らかの方法で詳細レコードのみを持つ各データフレームに追加することはできますか(複数のスカラーメンバーとそれぞれ1つのデータフレームを持つオブジェクトのコレクションなど)。

結局私は(例えばsampletype、日または日付など対mystatistic)各詳細レコードのグループ化からデータの統計を作成し、サンプルレコードの値に対してそれらをプロットします。私はカーネル密度推定PDFやヒストグラムのようなサンプルグループにも添付される中間シリーズを作成します。

ありがとうございました。

答えて

0

あなたはそれがすべて別々のグループを取得するために.fillna(method='ffill')、その後.groupby('header1')に新しいsampleレコードの場合を除き、空のようです第一columnという事実を使用することができます。これらには、あなたはすぐに統計を計算することができ、または別DataFrameとして保存します。高水準スケッチは次のようになります。

df.header1 = df.header1.fillna(method='ffill') 
for sample, data in df.groupby('header1'): 
    print(sample) # access to sample name 
    data = ... # process sample records 
+0

あなたの例では、私は簡単に私のデータを取得することができます。フォワードフィルはとても役に立ちました。私はあなたのサンプルがうまく動作していますが、 'for'ループの各パスは' sample'と 'data'を新しいオブジェクトに保存しなければなりません。私は2つの新しいデータフレームを望んでいました。これは、私がSQLテーブルについて考えるのに慣れているからです。私は 'groupby'オブジェクトを効率的に使う方法を頭に入れています。 –

0

上記の答えは正しい方向に進みました。更なる研究では、以下のものが使用された。サンプルを一意に識別する複合キーとして2つの列を使用する必要があることが判明しました。

df.header1 = df.header1.fillna(method='ffill') 
df.header2 = df.header2.fillna(method='ffill') 

grouped = df.groupby(['header1','header2']) 

samplelist = [] 
dfParent = pd.DataFrame() 
dfDetail = pd.DataFrame() 

for sample, data in grouped: 
    samplelist.append(sample) 
    dfParent = dfParent.append(grouped.get_group(sample).head(n=1), ignore_index=True) 
    dfDetail = dfDetail.append(data[1:], ignore_index=True) 

dfParent = dfParent.drop(['header3','header4',etc...]) # remove columns only used in 
                 # detail records 
dfDetail = dfDetail.drop(['header5','header6',etc...]) # remove columns only used once 
                 # per sample 

# Now details can be extracted by sample number in the sample list 
# (e.g. the first 10 for sample 0) 

samplenumber = 0 

dfDetail[ 
    (dfDetail['header1'] == samplelist[samplenumber][0]) & 
    (dfDetail['header2'] == samplelist[samplenumber][1]) 
    ].header3[:10] 

便利なリンクは以下の通りであった。

Pandas groupby and get_group

Pandas append to DataFrame