地图pandas系列列出会员资格

时间:2017-07-10 12:41:40

标签: python python-3.x pandas

说我有以下系列dtype('O')

s = pd.Series(list('abcde'))

以下列表(群组):

group1 = list('ab')
group2 = list('cd')
group3 = list('xy')

我想根据群组成员资格将s映射到新系列,如果没有会员资格,则填写np.nan。结果:

res
Out[17]: 
0    group1
1    group1
2    group2
3    group2
4       nan
dtype: object

我正在寻找比使用np.where的重复更多的pythonic方法:

res = pd.Series(np.where(s.isin(group1), 'group1',
                         np.where(s.isin(group2), 'group2',
                         np.where(s.isin(group3), 'group3',
                         np.nan))))

理想情况下,这意味着要将列表集合指定为单个可迭代,因为在我的实际问题中,我有更多的组。 res可以是Ocategorical

我尝试了什么:

  • 上面带有np.where的示例,虽然有效,但过于冗长。
  • 创建dict(zip(['group1', 'group2', 'group3'], [group1, group2, group3]))。被困在那里。

我觉得这可能是重复的,但我一开始就找不到。

注意:组列表将始终不相交。

1 个答案:

答案 0 :(得分:2)

我认为您需要重新构建映射。

从你的词典(dict(zip(['group1', 'group2', 'group3'], [group1, group2, group3])))开始:

d = {'group1': list('ab'), 'group2': list('cd'), 'group3': list('xy')}

假设不相交的列表,反向的将是:

reversed_map = {v: k for k, lst in d.items() for v in lst}

现在,你可以使用map:

s.map(reversed_map)
Out[19]: 
0    group1
1    group1
2    group2
3    group2
4       NaN
dtype: object