2016-03-24 7 views
2

にパンダピボットテーブルを平坦化します。アンピボットは、/ Iは次のように見える(しかしはるかに大きい)データフレームでの開始分析のための一つのレベルインデックス

Df1 = pd.pivot_table(loads, values=['Number'], 
         index = ['ID1', 'ID2'], 
         columns=['Type'], margins=True, 
         aggfunc=[sum] , fill_value=0) 

DF1:

       sum              
         Number                
type        B  D  E  I L  R All       
ID1  ID2                   
IE345  E90     0  0  0 38 0  0  38  
      E92     0  0 26  0 0  0  26  
      E93     0  0 21  0 0  0  21  
      E95     0  0  0  0 0  9  9  
IE346  E94     0  0  0 41 0  0  41  
      BLK     0  0  1  0 0  0  1 

の中へ:

DF1:

ID1  ID2     B  D  E  I L  R All                   
IE345  E90     0  0  0 38 0  0  38  
IE345  E92     0  0 26  0 0  0  26  
IE345  E93     0  0 21  0 0  0  21  
IE345  E95     0  0  0  0 0  9  9  
IE346  E94     0  0  0 41 0  0  41  
IE346  BLK     0  0  1  0 0  0  1 

pandas.meltは私が探しています何ですが、それを動作させるために管理傾けるようです。

その後、私は、行の最高値の列名を追加したいのですが、当然の余白なし:最大値については

ID1  ID2     B  D  E  I L  R All Max                   
IE345  E90     0  0  0 38 0  0  38 I  
IE345  E92     0  0 26  0 0  0  26 E 
IE345  E93     0  0 21  0 6  0  27 E 
IE345  E95     0  0  0  0 0  9  9 R 
IE345  E94     0  0  0 41 0  0  41 I 
IE345  BLK     0  0  1  0 1  0  2 E 

、私が使用:

df['Max'] = df.idxmax(axis=1, skipna=True) 

が、残念ながら、これはすべてを取ります。どのように私は私の目標を最も効率的な方法で達成することができますか?

!!! EDIT !!!!

最初の部分では、私はunpeotピボットテーブルを正確に返すソリューションを作成しました!コードここを参照してください:

df.columns = df.columns.get_level_values('Type') 
df.reset_index(inplace=True) 

は、今私は最大値のVmgをのソリューションを試してみましたが、残念ながらそれが返されます。この問題を解決する方法について

ValueError: could not convert string to float: 

任意のアイデア?

答えて

1

@vmgはすでにidxmaxはトリックを行います言ったように:

import io 
import StringIO  # for Python 2.X 
import pandas as pd 

data = """\ 
     id1  id2   type  number 
0  IE345  E90    I   38 
1  IE345  E92    E   26 
2  IE345  E93    E   21 
3  IE345  E95    R   9 
4  IE346  E94    I   41 
7  IE346  BLK    E   1 
""" 

#loads = pd.read_csv(io.StringIO(data), sep='\s+', index_col=0) # for Python 3.X 
loads = pd.read_csv(StringIO.StringIO(data), sep='\s+', index_col=0) # for Python 2.X 

# **** interesting part starts here **** 

# save all unique types, we will use it later 
types = loads.type.unique() 

df = pd.pivot_table(loads, values=['number'], 
         index = ['id1', 'id2'], 
         columns=['type'], margins=True, 
         aggfunc='sum', fill_value=0) \ 
     .reset_index() 

# reset column names 
df.columns = [c[1] if c[1] else c[0] for c in df.columns.tolist()] 

df['max'] = df[types].idxmax(axis=1) 

出力:

In [266]: df 
Out[266]: 
    id1 id2  E  I R All max 
0 IE345 E90 0.0 38.0 0.0 38.0 I 
1 IE345 E92 26.0 0.0 0.0 26.0 E 
2 IE345 E93 21.0 0.0 0.0 21.0 E 
3 IE345 E95 0.0 0.0 9.0 9.0 R 
4 IE346 BLK 1.0 0.0 0.0 1.0 E 
5 IE346 E94 0.0 41.0 0.0 41.0 I 
6 All  48.0 79.0 9.0 136.0 I 
+0

カラムからのユニークな値を持つ素晴らしいソリューション!とても賢い!ただし、まだ動作しません。型はこれを返します:['I' 'R' 'E' 'F' 'Y' 'G']エラーが発生します:KeyError: "['' '' '' 'E' 'F' 'Y' ' G ']インデックスにない " – Uis234

+0

@ Uis234、スクリプトを実行しようとしました__completely__ - 例外を介して行いますか? – MaxU

+0

私は試しました:types = np.unique(df [['Type']])、types = pd.unique(df.ravel())、types = df ['Type']。 "、" – Uis234

0

説明する最初の変換はまだ必要ではないようです。まだID1ID2をインデックスにしたいと思われるからです。最初の表現は、パンダが複数のインデックスを表示する方法で、2番目のエントリのすべてのエントリに対して最初のインデックスを繰り返すことはありません。すべてなしidxmaxを適用するの手元に

あなたの問題は、で達成することができます:

proef['Dominant'] = proef.iloc[:,:-1].idxmax(axis=1, skipna=True)

iloc[:,:-1]はちょうどあなたが右端の列を無視していることを意味します。

+0

HI Vmgを、あなたの答えをありがとう!当初のデータフレームはもちろん、上記のピボットテーブルとは異なります。さもなければ、変換は必要ではないでしょう。初めに行った変換が必要なので、最初のデータフレームを使って質問を更新します。これは、表示されているように変換されて戻ってきます。 – Uis234

関連する問題