2016-04-26 12 views
1

ほとんどのNaNを含むデータフレームがありますが、特定のエントリには辞書もあります。私の目標は、これらの辞書をデータフレームの列に展開し、それぞれのインデックスにエントリを保持することです。 これは、データフレームの小さな部分の外観です。辞書でデータフレームを展開する

                 _id _score 
query               
chrM:g.146T>C               NaN NaN 
chrM:g.11723C>T               NaN NaN          NaN NaN 
chrM:g.11813A>G               NaN NaN 
chrM:g.12140T>A               NaN NaN 
...                  ... ...  
chr1:g.11976370T>G   {u'ref': u'T', u'alleles': [{u'allele': u'T', ... NaN 
chr1:g.12007164A>G              NaN NaN 
chr1:g.12007165A>G              NaN NaN 

はこれまでのところ、私はちょうど、各辞書のキーを選んで、これらのキーと名前の列を追加するために管理してきました:

s ={} 
for cols in cols: 
    if type(data1[cols].dropna()[0]) == type(s): 
     cols_var = np.array(data1[cols].dropna()[0].keys()) 
     data1 = pandas.concat([data1,pandas.DataFrame(columns=cols_var)]) 

効率的にこれを行う方法上の任意のヘルプやヒントをし、読めるようになります。

** EDIT:**このコード:

allele_origin     unspecified 
alleles       [{u'allele': u'G'}, {u'allele': u'A'}]  
alt        A 
...        ... 
rsid        rs201327123 
vartype       snp 
dtype: object 

私はここから作業をしてみてくださいよ、他の入力がはるかに高く評価されています

y = pandas.Series((dbsnp.iloc[0])) 
print y 

しかし多少役に立つ何かを取得します。

+0

完全な辞書を表示できますか?それは入れ子になっているようです。どのようにそれを正確に拡大したいのですか? – IanS

+0

あなたは正しいです。それはネストされ、他の列もネストされた辞書を含むことができる。具体的なものは次のとおりです: '{u'ref':u'G '、u'alleles':[{u'allele ':u'G'}、{u'allele ':u'A'} ] '、' u'rsa ':u'rsvtype':u'ts '、u'allele_origin':u'unspecified '、u'dbsnp_build':137、u'rsid ':u'rs201327123'、u'flags ':[u'ASP'、 u'R3 ']、u'hg19':{u'start ':14677、u'end':14678}、u'alt ':u'A'、u'validated:True、u'chrom ':u '1'、u'class ':u'SNV'、u'vartype ':u'snp'} ' –

+0

私のソリューションをチェックして、それがあなたに適しているかどうか確認できますか? – IanS

答えて

1

複数の列を持つデータフレームに辞書を展開するには、辞書をパンダシリーズとして返す関数applyを用意する必要があります。これを行うには、まずNaNの値を削除する必要があります。

最初の列:s = data1['_id'].dropna()から始めましょう。以下は辞書から作られた拡張データフレーム戻ります:

expanded_df = s.apply(lambda row: pandas.Series(row)) 

このシリーズに辞書を変換ラムダ(すなわちインライン)関数を利用します。これで、オリジナルのもので、拡張データフレームをマージすることができます

pandas.concat([data1, expanded_df], axis=1) 

concat関数は、インデックスによって行が一致し、かつexpanded_dfに欠けているインデックスのNaN値を入れます。便利なのは、最初のステップでdropnaで削除した行だけです。

data1のすべての列に対して、元のように列を反復するか、data1applyを使用してこれを行うことができます。

+0

それは働いた!ちょっとした詳細:入れ子の辞書はまだ辞書として残っていました。だから私はそれらを特定した後にそのような機能の別の実行を実行することができると思う。最後に、私はdictsを含むコラムがまだそこにあるので、私はそれらを落とすだけであることがわかります。しかし、それ以外に、良い見えます。ありがとうございました。 –

+0

はい、私は手順を繰り返すことがネストされた辞書に対処する唯一の方法であることを恐れています。どちらか、ラムダ関数の中でそれらを処理してください。私は今日後で試してみることができます... – IanS

+0

間違いなく。私は昨日それを投票しようとしましたが、私はまだ15ポイントの評判xDに達しなければならないので、私はそうすることができません。私はまた、方法を繰り返すことを試みる、あなたを戻すだろう。もう一度ありがとう。 –

関連する問題