ブール配列のさまざまな組み合わせをキーとして使用したパンダのグループ化の結果

Aug 19 2020

ブール配列をキーとして使用してグループを理解しようとしました。これがテストコードです。

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

回答

RichieV Aug 20 2020 at 04:23

分解しましょう

.groubpy().apply(pd.DataFrame)すべてのバリアントで使用すると、各グループから行を取得してデータフレームを作成します。これは基本的にを返すselfため、出力は同じように見えますが、パンダがそこに到達する方法はすべての場合で異なります。

  1. b=a.groupby([False,False]):両方の行は同じグループ(group_id False)に属し、同じdfを形成するために一度一緒に解析されます

  2. c=a.groupby([True,False]):それぞれ1行の2つのグループがあります。Applyは各グループを取得し、2つの別々のDataFrameを構築します(グループごとに1つ)。次に、元のdfと同一のdfを連結して元に戻します

  3. d=a.groupby([False,True]):#2と同じですが、最初の行はグループに属しFalseます。別の関数(pandas.DataFrame以外)を集約または適用した場合True, False、インデックスとしてdfが表示され(デフォルトではgroupbyで並べ替え)、行1はグループに属しているため、最初の行として表示されます。True

1 AkshaySehgal Aug 20 2020 at 04:14

これは、渡すグループ化パラメーターがデータフレームを必要な部分にスライスできないためです。したがって、データフレーム全体をコピーし、渡したグループ化配列に「圧縮」するだけです。例 -

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]、各タプルの要素と結合して垂直方向に連結します。