_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
_
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
最高のパフォーマンスを得るには、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'
の一意の(重複しない)値を持つことを保証するため機能します。