在Python中编写更简洁的lambda

时间:2014-11-18 23:19:49

标签: python pandas lambda

我正在尝试与Pandas合作解决一些数据问题,并且已经达到了我正在编写这样的代码的程度:

groups.segment = groups.topic.map(lambda x: 'friends' if 'friend' in str(x) else x)
groups.segment = groups.topic.map(lambda x: 'friends' if 'bro' in str(x) else x)
groups.segment = groups.topic.map(lambda x: 'friends' if 'girls' in str(x) else x)

我想以更简洁的方式编写它,我不必拥有一堆复制和粘贴代码。 python有点新,所以不确定如何让它变得更好。任何帮助赞赏。

有些事情:

groups.segment = groups.segment.map(lambda x: 'friends' if 'bro' or 'girls' or 'friend' in str(x) else x)

有办法做到这一点吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

最好不要在这里使用lambda

def mapper(x)
    if any(y in str(x) for y in ('friend', 'bro', 'girls')):
        return 'friends'
    return x

groups.segment = groups.topic.map(mapper)

您可以在此使用any,当至少有一个传递的值为True时,会返回True

答案 1 :(得分:1)

lambda x: 'friends' if 'bro' in str(x) or 'girls' in str(x) or 'friend' in str(x) else x

答案 2 :(得分:1)

您可以完全避免使用maplambda并使用isin(),这最终会更像if item in ['a', 'b', 'c']:的典型Python惯用法

import pandas as pd

df = pd.DataFrame({'relationship': ['friends', 'friend', 'bro', 'girls']})
df
Out[3]: 
  relationship
0      friends
1       friend
2          bro
3        girls

is_synonym = df.relationship.isin(['friend', 'bro', 'girls'])
df['relationship2'] = df['relationship'].copy()
df.loc[is_synonym, 'relationship2'] = 'friends'
df
Out[15]: 
  relationship relationship2
0      friends       friends
1       friend       friends
2          bro       friends
3        girls       friends