web-dev-qa-db-ja.com

Python Pandas:aggfuncを含むピボットテーブル=一意の数をカウント

_df2 = pd.DataFrame({'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2','Y1','Y1','Y1'], 'Z' : ['Z3','Z1','Z1','Z2']})

    X   Y   Z
0  X1  Y2  Z3
1  X1  Y1  Z1
2  X1  Y1  Z1
3  X1  Y1  Z2

g=df2.groupby('X')

pd.pivot_table(g, values='X', rows='Y', cols='Z', margins=False, aggfunc='count')
_

トレースバック(最後の最後の呼び出し):... AttributeError: 'Index' object has no attribute 'index'

他の2つの列に対して1つのDataFrame列の一意の値の数を含むピボットテーブルを取得するにはどうすればよいですか?
一意のカウントのaggfuncはありますか? np.bincount()を使用する必要がありますか?

NB。 'シリーズ' values_counts()は知っていますが、ピボットテーブルが必要です。


編集:出力は次のようになります。

_Z   Z1  Z2  Z3
Y             
Y1   1   1 NaN
Y2 NaN NaN   1
_
47
dmi

Pandasの最新バージョンでは最新の回答が得られないため、この問題の別の解決策を書いています。

In [1]:
import pandas as pd

# Set exemple
df2 = pd.DataFrame({'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2','Y1','Y1','Y1'], 'Z' : ['Z3','Z1','Z1','Z2']})

# Pivot
pd.crosstab(index=df2['Y'], columns=df2['Z'], values=df2['X'], aggfunc=pd.Series.nunique)

Out [1]:
Z   Z1  Z2  Z3
Y           
Y1  1.0 1.0 NaN
Y2  NaN NaN 1.0
0
Benoit Drogou

最高のパフォーマンスを得るには、DataFrame.drop_duplicatesフォローアップaggfunc='count'を行うことをお勧めします。

aggfunc=pd.Series.nuniqueが機能することは間違いありません。ただし、所有しているindexグループの数が多い場合(> 1000)、これは遅くなる可能性があります。

代わりに(@Javierを引用する)

df2.pivot_table('X', 'Y', 'Z', aggfunc=pd.Series.nunique)

私は提案します

df2.drop_duplicates(['X', 'Y', 'Z']).pivot_table('X', 'Y', 'Z', aggfunc='count')

これは、すべてのサブグループ(('Y', 'Z')の各組み合わせ)が'X'の一意の(重複しない)値を持つことを保証するため機能します。

0
grisaitis