2017-12-09 2 views
0

質問移入データフレーム

私はこのようになります辞書を持っている:

d = { 
'a': [['a', 0], ['b', 1], ['a', 2]], 
'b': [['d', 0], ['d', 1], ['d', 3]], 
'c': [['f', 2], ['g', 3], ['h', 4]] 
} 

辞書の形式は次のとおりです。column: [[value, row_number], ... ]

私はこれを変換したいのですが

 a  b  c 
0  a  d None 
1  b  d None 
2  a None  f 
3 None  d  g 
4 None None  h 
のようなデータフレームに変換します。

試み

私はこれを行うに考えることができる唯一の方法は、フォームの新しい辞書を作成することです:

new = { 
'a': ['a', 'b', 'a', None, None], 
'b': ['d', 'd', None, 'd', None], 
'c': [None, None, 'f', 'g', 'h'] 
} 

をし、この辞書は、次のようにデータフレームを作成するために使用することができます。

df = pd.DataFrame(new) 

私はこれを行うためのループを書くことができましたが、それはむしろ退屈であり、より良い方法があるかどうか疑問に思っています。お知らせ下さい。

答えて

1

変更あなたの辞書はここに移動する方法があるが、別ソリューション

df=pd.DataFrame(d) 
df1=pd.concat([df[x].apply(pd.Series).set_index(1) for x in df.columns],1) 
df1.columns=df.columns 
df1 
Out[477]: 
    a b c 
1    
0 a d NaN 
1 b d NaN 
2 a NaN f 
3 NaN d g 
4 NaN NaN h 

ですあなたのdictを変えるように

d1={k:{t[1]:t[0] for t in v} for k,v in d.items()} 
d1 
Out[479]: 
{'a': {0: 'a', 1: 'b', 2: 'a'}, 
'b': {0: 'd', 1: 'd', 3: 'd'}, 
'c': {2: 'f', 3: 'g', 4: 'h'}} 
0

私はこれをまっすぐにpandasに入れないと、オブジェクトを扱うようにスピードアップが大幅に向上すると思います。したがって、pandas以外のリストの辞書を変更するのが最善です。これを行うための最善の方法は、pandasDataFramedict秒のdictを変換まったく問題ありとして、辞書に各リストを変換するために、次のようになります。

In [ ]: new_d = {col_name:{row_num: value for value, row_num in col_data} for col_name, col_data in d.items()} 
    ...: pd.DataFrame(new_d) 
Out[ ]: 
    a b c 
0 a d NaN 
1 b d NaN 
2 a NaN f 
3 NaN d g 
4 NaN NaN h 
0

再構築辞書を次のように:

d2 = {colname: {sublist[1]: sublist[0] for sublist in listoflists} \ 
     for colname, listoflists in d.items()} 
df = pd.DataFrame(d2) 
df.where(pd.notnull(df), None) # replace np.nan with None 
    a b c 
0 a d None 
1 b d None 
2 a None f 
3 None d g 
4 None None h 
0

data = [(key,ix,val) for key, pair in d.items() for val, ix in pair] 
df = pd.DataFrame(data).pivot(index=1, columns=0, values=2) 

出力:

あなたは再配置のビットの後、pivot()を使用することができます。

0  a  b  c 
1     
0  a  d None 
1  b  d None 
2  a None  f 
3 None  d  g 
4 None None  h 

注:列とインデックスの値を削除するには、使用:あなたが希望した場合

df.index.name = "" 
df.columns.name = ""