2017-08-21 17 views
0

私は2500万レコード以上のパンダデータフレームに非常に疎なデータを持っています。これを多次元配列に変換する必要があります。私はこれをループを使って簡単な方法で書いていますが、より効率的な方法があるかどうか疑問に思っていました。pandas dfを多次元numpy配列に変換します

import numpy as np 
import pandas as pd 

facts_pd = pd.DataFrame.from_records(columns=['name','offset','code'], 
    data=[('John', -928, 'dx_434'), ('Steve',-757,'dx_5859'), ('Jack',-800,'dx_250'), 
      ('John',-919,'dx_401'),('John',-956,'dx_5859')]) 

name_lu = pd.DataFrame(sorted(facts_pd['name'].unique()), columns=['name']) 
name_lu["nameid"] = name_lu.index 

offset_lu = pd.DataFrame(sorted(facts_pd['offset'].unique(), reverse=True), columns=['offset']) 
offset_lu["offsetid"] = offset_lu.index 

code_lu = pd.DataFrame(sorted(facts_pd['code'].unique()), columns=['code']) 
code_lu["codeid"] = code_lu.index 

facts_pd = pd.merge(pd.merge(pd.merge(facts_pd, name_lu, how="left", on="name") 
    , offset_lu, how="left", on="offset"), code_lu, how="left", on="code") 
facts_pd.drop(["name","offset","code"], inplace=True, axis=1) 

facts_np = np.zeros((len(name_lu),len(offset_lu),len(code_lu))) 
for row in facts_pd.iterrows(): 
    i,j,k = row[1] 
    facts_np[i][j][k] = 1 
+0

私は '.values'と' .reshape'を使って素早く行うべきだと思います。あなたは、あなたの入力がどのように見えるのか、それをどのように変換したいのか、いくつかのおもちゃのデータについてどうかを教えてください。 –

+0

私の入力は 'facts_pd'のように見え、' facts_np'のように出力したいです。 – ironv

+0

ありがとうございます。実際のデータ値やおもちゃのサンプルを参考にしています。 '行[1] 'に何が入っているのか、それをどのように翻訳したいのかははっきりしていません。 –

答えて

0

あなたはおそらく探しているコマンドは、このコマンドがhereはそれのためのmanページで言っているにもかかわらず、numpyの配列ではなく行列を返しますdataframe.as_matrix()です。

Here

はNP Pd等

インポートパンダのような別のそれの使用にスタックオーバーフローのトピックも

-1

済コード

インポートnumpyのある

facts_pd = pd.DataFrame.from_records ( 'John'、-928、 'dx_434')、( 'Steve'、 - 757、 'dx_5859')、( 'Jack' '、-800、' dx_250 ')、 (' John '、 - 919、' dx_401 ')、(' Jo HN」、 - 956、 'dx_5859')])

facts_np = facts_pd.as_matrix()

印刷facts_np位numpyの配列形式でデータフレームを表示します。

関連する問題