我正在尝试与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)
有办法做到这一点吗?
感谢您的帮助!
答案 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)
您可以完全避免使用map
和lambda
并使用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