2017-07-20 8 views
2

私は、Pythonで自然から簡単に長いものから広いものに変換したり、逆に変換したりしていません。想像 、私は、プロパティの列の多くと非常にうまくそれがきちんと維持によって処理されpython pandas pivot:適切な整頓のような普及をするには?

PropA ... PropZ Value 
green  Saturn 400 
green  Venus 3 
red  Venus 2 
. 
. 

データそのもののように、すべての実際の値を含む単一の列で大整頓データフレームを持っています。しかし、時には、ある種のプロパティ(例えば、他のプロパティと似ているすべてのアイテム)と赤を比較することは面白いかもしれません。 それで、まっすぐ進む方法は、それをできるだけきれいに保ち、私が興味を持っている特定の財産(プロA)を払い落とすだけです。その後、どのような機能であれ行方向のマップを実行することができ、function-ouputを含む追加のPropA-Entryを作成することができました。

しかし、他のすべてのプロパティをきれいに保つことは、私がRを使って慣れていたほど簡単ではありません。その理由は、すべての重要でないプロパティは、私が見つけたすべてのpd-methods 。私はいくつかの列を保持したい場合は、それは完全に混乱している。

この問題をどのように解決しますか。これらのタイプの問題に対処するうえで、他にもいろいろな方法がありますか?


私は自分自身でスプレッド方式を書いていますが、それは非常に遅いです。たぶん、私はどのように改善できるか考えてみてください。

#the idea is to group by the remaining properties, which should be left in the long format. 
#then i spread the small tidy data table for any group 
    @staticmethod 
    def spread(df, propcol, valcol): 
     def flip(data,pc,vc): 
      data = data.reset_index(drop=True) 
      return {data[pc][i]:[data[vc][i]] for i in range(0,len(data))} 

     #index columns are all which are not affected 
     indcols = list(df.columns) 
     indcols.remove(propcol) 
     indcols.remove(valcol) 

     tmpdf=pd.DataFrame() 
     for key, group in df.groupby(indcols): 
      dc1 = {a:[b] for (a,b) in zip(indcols,key)} 
      dc2 = flip(group,propcol,valcol) 
      tmpdf = pd.concat([tmpdf,pd.concat([pd.DataFrame(dc1),pd.DataFrame(dc2)],axis=1)]) 

     return tmpdf.reset_index(drop = True) 
+0

マルチインデックスでは不十分でしょうか?リンクのための合理的な説明があります(ここではhttps://stackoverflow.com/questions/35414625/pandas-how-to-run-a-pivot-with-a-multi-index) – asongtoruin

+0

thxです。つまり、階層的な索引付けによって整然としたデータを整理する方が良いでしょうか?したがって、すべてのプロパティをインデックスに渡して値の列のみを保持することで、すべてのデータを整理する必要があります。情報の大部分がインデックスに取り込まれているため、これは少し不便です。さらに、私の財産は実質的に階層的なものではなく、交換可能である。 – Antalagor

答えて

1

ヒントの助けを借りて、私はより単純なバージョンを作成しました。 私はまだインデックスのメカニックと少し混乱していますが、時間がわかりやすくなります。

def spread(df, propcol, valcol): 
    indcol = list(df.columns.drop(valcol)) 
    df = df.set_index(indcol).unstack(propcol).reset_index() 
    df.columns = [i[1] if i[0] == valcol else i[0] for i in df.columns] 
    return df 
関連する問題