ブール配列のさまざまな組み合わせをキーとして使用したパンダのグループ化の結果
ブール配列をキーとして使用してグループを理解しようとしました。これがテストコードです。
a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
print(a)
A B C
0 True False False
1 False True False
次に、ブール配列のさまざまな組み合わせを試しました。これは、groupbyの結果がすべて同じであるようです。
b=a.groupby([False,False])
b.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
c=a.groupby([True,False])
c.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
d=a.groupby([False,True])
d.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
e=a.groupby([False,True])
e.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
回答
分解しましょう
.groubpy().apply(pd.DataFrame)
すべてのバリアントで使用すると、各グループから行を取得してデータフレームを作成します。これは基本的にを返すself
ため、出力は同じように見えますが、パンダがそこに到達する方法はすべての場合で異なります。
b=a.groupby([False,False])
:両方の行は同じグループ(group_idFalse
)に属し、同じdfを形成するために一度一緒に解析されますc=a.groupby([True,False])
:それぞれ1行の2つのグループがあります。Applyは各グループを取得し、2つの別々のDataFrameを構築します(グループごとに1つ)。次に、元のdfと同一のdfを連結して元に戻しますd=a.groupby([False,True])
:#2と同じですが、最初の行はグループに属しFalse
ます。別の関数(pandas.DataFrame以外)を集約または適用した場合True, False
、インデックスとしてdfが表示され(デフォルトではgroupbyで並べ替え)、行1はグループに属しているため、最初の行として表示されます。True
これは、渡すグループ化パラメーターがデータフレームを必要な部分にスライスできないためです。したがって、データフレーム全体をコピーし、渡したグループ化配列に「圧縮」するだけです。例 -
a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
c = a.groupby([True,False])
print('length of grouper object:',len(c))
print(' ')
print(list(c)[0])
print(' ')
print(list(c)[1])
length of grouper object: 2
(False, A B C
1 False True False)
(True, A B C
0 True False False)
グループ化配列[False、True]を使用すると、データフレーム全体をそれぞれで単純に圧縮することに注意してください。代わりに、軸1で見つかるものを渡した場合、データセットをグループ化するためにそのシリーズのアイテムが考慮されます。
別の見方をすれば、グループ化パラメーターは名前の付いたシリーズである必要があり、この名前はデータフレームの列にある必要があります。配列[True、False]を渡すと、基本的に名前のない系列として解釈されるため、分割を行うためのキーを取得できません。
groupbyがどのように機能するかを理解したい場合は、次の画像を使用することをお勧めします-

分割は指定されたキーで発生し、キーはインデックス/列で参照可能である必要があります。そうでない場合、分割できず、各グループで分割されていないデータフレームを返すだけです。この最初のステップはハタが行うことであり、次は簡単な適用と結合のステップです。上記のタプル(印刷出力)では、apply関数t[1]
は各タプルの要素を操作し、その後t[0]
、各タプルの要素と結合して垂直方向に連結します。