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

如何将两个布尔列展平为一个新列(这可能会导致 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但如果这是唯一的方法,我会接受)。

我通常将其视为“从宽到长”,反之(从一列到一堆布尔值)为“从长到宽”。

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 回答