说我有以下系列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
可以是O
或categorical
。
我尝试了什么:
np.where
的示例,虽然有效,但过于冗长。dict(zip(['group1', 'group2', 'group3'], [group1, group2, group3]))
。被困在那里。我觉得这可能是重复的,但我一开始就找不到。
注意:组列表将始终不相交。
答案 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