2013-10-09 24 views
8

結果として文字列を含むテーブルのピボットを実行しようとしています。pandas - 数値以外の値を指定したpivot_table? (DataError:集計する数値型がありません)

import pandas as pd 

df1 = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': ["on","off","off","on","on","off","off","on"]}) 

df1.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

しかし、私は得る:DataError: No numeric types to aggregate

意図したとおり、私は数字に結果の値を変更したときに、この作品:

df2 = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': [1,0,0,1,1,0,0,1]}) 

df2.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

をそして私は私が必要なものを得る:

variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN NaN 1 
4   NaN 1 NaN NaN NaN NaN 
5   NaN NaN NaN NaN NaN 0 
6   NaN NaN NaN NaN 0 NaN 
7   NaN NaN NaN 1 NaN NaN 

私は数値に文字列をマッピングして、逆にすることができます知っています操作、しかしもっと洗練されたソリューションがありますか?

答えて

23

私のオリジナルの返信はパンダ0.14.1に基づいて、それ以来、多くの物事がpivot_table機能で変更されました(行 - >インデックス、COLS - >列...)さらに

、それが表示されます私が投稿した元のラムダのトリックは、もはやパンダ0.18で動作しません。還元関数を指定する必要があります(min、max、meanであっても)。しかし、それさえも不適切なように見えた - 私達はちょうどそれを変換し、データセットを削減していないので....だから私は、インデックス+を使用してデータにインデックスを設定し、スタック解除...

import pandas as pd 

df1 = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': ["on","off","off","on","on","off","off","on"]}) 

# these are the columns to end up in the multi-index columns. 
unstack_cols = ['variable1', 'variable2', 'variable3'] 

最初は難しく見えましたスタックする列を作成し、レベルargを使用してスタックを呼び出します。

df1.set_index(['index'] + unstack_cols).unstack(level=unstack_cols) 

結果のデータフレームは次のとおりです。

enter image description here

+0

最後に、パンダのピボット()変更を置き換えるソリューション0.17.1 – camdenl

+0

@RandallGoodwin、私はこの質問が2歳であることを認識していますが、エラーが発生しています "ValueError: "あなたのラムダを使って、あなたの頭の上から、なぜあなたは知っていますか? – RustyShackleford

+1

別のアイデア:潜在的に複数の値が表示される場合は、 'aggfunc = lambda x:" ".join([y in x]のstr(y))' – dllahr

2

私は、パンダがデータをよりよく理解し、知的で予期された方法で行動できるように、True/Falseでオン/オフを置き換えることが最善の策だと思います。

df2 = df1.replace({'on': True, 'off': False}) 

あなたは本質的にあなたの質問でこれを認めました。私の答えは、私はより良い方法があるとは思わない、そして、あなたは次の何が来るのかとにかく 'on'/'off'を置き換えなければならない。

Andy Haydenがコメントに指摘しているように、1/0でオン/オフを置き換えると、パフォーマンスが向上します。

+1

+1、しかしデータフレームは、オブジェクトDTYPEではなく、浮いているように:) –

+0

を私はそれを検討したことがないので、1と0を使用する方が良いかもしれません。いい視点ね。 –

+0

OK、十分だと思われます:) –

関連する問題