假设我有以下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有没有内置的支持?
答案 0 :(得分:1)
副手我不记得一个在熊猫中做这个的功能作为一个单行,但你可以做这样的事情:
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