我有一个 pandas 数据框,其中包含“名称”列。名称列中的字符串可能包含“Joe”、“Bob”或“Joe Bob”。我想为人员类型添加一列:仅 Joe、仅 Bob 或两者。
我可以通过创建 boolean 列,将它们转换为字符串,组合字符串,然后替换值来做到这一点。只是……感觉不太优雅!我是 Python 新手...有更好的方法吗?
我的原始数据框:
df = pd.DataFrame(data= [['Joe Biden'],['Bobby Kennedy'],['Joe Bob Briggs']], columns = ['Name'])
我添加了两个 boolean 列来查找名称:
df['Joe'] = df.Name.str.contains('Joe')
df['Joe'] = df.Joe.astype('int')
df['Bob'] = df.Name.str.contains('Bob')
df['Bob'] = df.Bob.astype('int')
现在我的数据框看起来像这样:
df = pd.DataFrame(data= [['Joe Biden',1,0],['Bobby Kennedy',0,1],['Joe Bob Briggs',1,1]], columns = ['Name','Joe', 'Bob'])
但我真正想要的是一个包含分类值的“类型”列:Joe、Bob 或两者。
为此,我添加了一列来组合 boolean 值,然后替换了值:
df["Type"] = df["Joe"].astype(str) + df["Bob"].astype(str)
df['Type'] = df.Type.astype('str') df['Type'].replace({'11': 'Both', '10': 'Joe','1': 'Bob'}, inplace=True)
这感觉很笨拙。大家有更好的办法吗?
谢谢!
最佳答案
您可以使用np.select
创建列类型
。
您需要按照从最精确到最宽的顺序正确排序您的condlist
。
df['Type'] = np.select([df['Name'].str.contains('Joe') & df['Name'].str.contains('Bob'),
df['Name'].str.contains('Joe'),
df['Name'].str.contains('Bob')],
choicelist=['Both', 'Joe', 'Bob'])
输出:
>>> df
Name Type
0 Joe Biden Joe
1 Bobby Kennedy Bob
2 Joe Bob Briggs Both
关于python - 在Python中根据字符串值创建分类列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69108895/