2016-12-19 11 views
1

にパンダで辞書エントリを解凍し、それは、私がいずれかの列が辞書を持っているデータフレームを持つデータフレーム

import pandas as pd 
import numpy as np 

def generate_dict(): 
    return {'var1': np.random.rand(), 'var2': np.random.rand()} 

data = {} 
data[0] = {} 
data[1] = {} 
data[0]['A'] = generate_dict() 
data[1]['A'] = generate_dict() 

df = pd.DataFrame.from_dict(data, orient='index') 

enter image description here

私は辞書内のキー/値のペアを展開したいと思います新しいデータフレーム。各エントリには独自の行があります。

def expand_row(row): 
    df_t = pd.DataFrame.from_dict({'value': row.A}) 
    df_t.index.rename('row', inplace=True) 
    df_t.reset_index(inplace=True) 
    df_t['column'] = 'A' 
    return df_t 

df_expanded = pd.DataFrame([]) 
for _, row in df.iterrows(): 
    T = expand_row(row) 
    df_expanded = df_expanded.append(T, ignore_index=True) 

enter image description here

これはかなり遅いです、そして私のアプリケーションは、パフォーマンスが重要です:私は、行を反復処理して、新しいデータフレームに付加することによってそれを行うことができます。私はこれをdf.applyで行うことができます。しかし、私の関数がシリーズではなくDataFrameを返すので、単に

df_expanded = df.apply(expand_row) 

というように動作しません。これを行う最も効果的な方法は何でしょうか?

ありがとうございます。

答えて

1

あなたはネストされたリストの内包表記を使用して、一定のA(列名)でカラム0を置き換えることができます。

d = df.A.to_dict() 

df1 = pd.DataFrame([(key,key1,val1) for key,val in d.items() for key1,val1 in val.items()]) 
df1[0] = 'A' 
df1.columns = ['columns','row','value'] 
print (df1) 
    columns row  value 
0  A var1 0.013872 
1  A var2 0.192230 
2  A var1 0.176413 
3  A var2 0.253600 

別の解決策:

df1 = pd.DataFrame.from_records(df.A.values.tolist()).stack().reset_index() 
df1['level_0'] = 'A' 
df1.columns = ['columns','row','value'] 
print (df1) 
    columns row  value 
0  A var1 0.332594 
1  A var2 0.118967 
2  A var1 0.374482 
3  A var2 0.263910 
関連する問題