1

以下の DataFrame があるとします。

>>> dfrm = pandas.DataFrame({
                             "A":[1,2,3], 
                             "id1":[True, True, False], 
                             "id2":[False, True, False]
                            })

>>> dfrm
   A    id1    id2
0  1   True  False
1  2   True   True
2  3  False  False

2 つのブール列を新しい列にフラット化するにはどうすればよいですか (これにより、DataFrame の行を繰り返す必要が生じる可能性があります)。その結果、新しい列にすべての True オカレンスのエントリが表示されます。

具体的には、上記の例では、出力を次のようにする必要があります。

index A   id1    id2   all_ids
    0 1  True  False       id1
    1 2  True   True       id1
    1 2  True   True       id2
    2 3 False  False       NaN

(できればマルチインデックス化されてall_idsいませんが、それが唯一の方法である場合はそれを採用します)。

私は一般的に、これを「ワイドからロング」と見なし、逆 (1 つの列からブール値の束へ) を「ロングからワイド」と見なしました。

Pandas にこれに対する組み込みのサポートはありますか?

4

1 に答える 1

2

パンダでワンライナーとしてこれを行う関数を思い出すことはできませんが、次のようなことができます:

In [35]: st = dfrm.ix[:, ['id1', 'id2']].stack()

In [36]: all_ids = Series(st.index.get_level_values(1), 
                          st.index.get_level_values(0),
                          name='all_ids')[st.values]

In [37]: dfrm.join(all_ids, how='left')
Out[37]: 
   A    id1    id2 all_ids
0  1   True  False     id1
1  2   True   True     id1
1  2   True   True     id2
2  3  False  False     NaN
于 2012-09-26T02:48:52.643 に答える