2017-07-10 19 views
0

は、私は、次のシリーズ、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の繰り返しを使用するよりも、そうすることのより多くの神託の方法を探しています:

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

理想的には、これがシングルとしてリストのコレクションを指定するような何かをやって意味します私の本当の問題はグループの数がはるかに多いためです。 resは、dtype Oまたはcategoricalとすることができます。

  • 上記の例を動作しますが、過度に冗長ですnp.where、と私が試した何

  • dict(zip(['group1', 'group2', 'group3'], [group1, group2, group3]))を作成してください。そこにはまった。

これは重複している可能性がありますが、最初の試みでは見つかりませんでした。

注:の場合、グループリストは常に分離しています。

+0

あなたのコメントに早く返信する機会がありませんでした。私はあなたの最善の策は最初にそのマッピングを構築することだと思うが、私はあなたがそれらのリストを取得しているか分からない。いずれにせよ、効率が問題であれば、受け入れられないように自由に感じてください。問題が解決されない場合、人々は代替案に取り組む可能性が非常に高い。 – ayhan

答えて

2

私はマッピングを再構成する必要があると思います。

あなたのdict(dict(zip(['group1', 'group2', 'group3'], [group1, group2, group3])))最低料金:

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

逆転1は、ばらばらのリストを想定し、次のようになります。

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

さて、あなただけのマップを使用することができます。

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