1. ホーム
  2. python

[解決済み] pandas データフレームの選択された列の値のユニークな組み合わせとカウント

2022-04-27 11:56:28

質問

pandasのデータフレームに以下のようなデータが入っています。

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
                   'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})

ということで、私のデータは以下のようになります。

----------------------------
index         A        B
0           yes      yes
1           yes       no
2           yes       no
3           yes       no
4            no      yes
5            no      yes
6           yes       no
7           yes      yes
8           yes      yes
9            no       no
-----------------------------

これを別のデータフレームに変換したい。 期待される出力は以下のpythonスクリプトで示すことができます。

output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})

つまり、私の期待する出力は次のようなものです。

--------------------------------------------
index      A       B       count
--------------------------------------------
0         no       no        1
1         no      yes        2
2        yes       no        4
3        yes      yes        3
--------------------------------------------

実は、以下のコマンドを使えば、すべての組み合わせを見つけ出し、カウントすることができる。 mytable = df1.groupby(['A','B']).size()

しかし、そのような組み合わせは1つの列になっていることがわかりました。 私は、組み合わせの各値を別のカラムに分離し、さらにもう1つカラムを追加して、カウントの結果を表示したいと思います。 そのようなことは可能でしょうか? ご教授願えませんでしょうか。 よろしくお願いします。

どのように解決するのですか?

あなたは groupby を呼び出すと、'A' と 'B' の列で size で、次に reset_indexrename は、生成されたカラムです。

In [26]:

df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Out[26]:
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

更新

少し説明すると、2つの列でグループ化することで、AとBの値が同じ行をグループ化しています。 size で、ユニークなグループの数を返します。

In[202]:
df1.groupby(['A','B']).size()

Out[202]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64

そこで、グループ化されたカラムを復元するために reset_index :

In[203]:
df1.groupby(['A','B']).size().reset_index()

Out[203]: 
     A    B  0
0   no   no  1
1   no  yes  2
2  yes   no  4
3  yes  yes  3

これはインデックスを復元しますが、サイズ集計は生成されたカラムに変わります。 0 そのため、この名前を変更する必要があります。

In[204]:
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})

Out[204]: 
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

groupby はアーギュメントを受け付けます。 as_index に設定することができます。 False ということで、グループ化されたカラムをインデックスにしないのですが、これだと series で、やはりインデックスの復元などが必要になりますね......。

In[205]:
df1.groupby(['A','B'], as_index=False).size()

Out[205]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64