python - 在Python中根据字符串值创建分类列

标签 python pandas dataframe boolean categorical-data

我有一个 pandas 数据框,其中包含“名称”列。名称列中的字符串可能包含“Joe”、“Bob”或“Joe Bob”。我想为人员类型添加一列:仅 Joe、仅 Bob 或两者。

我可以通过创建 boolean 列,将它们转换为字符串,组合字符串,然后替换值来做到这一点。只是……感觉不太优雅!我是 Python 新手...有更好的方法吗?

我的原始数据框:

df = pd.DataFrame(data= [['Joe Biden'],['Bobby Kennedy'],['Joe Bob Briggs']], columns = ['Name'])
<表类=“s-表”> <标题> 0 姓名 <正文> 1 乔·拜登 2 鲍比·肯尼迪 3 乔·鲍勃·布里格斯

我添加了两个 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'])
<表类=“s-表”> <标题> 0 姓名 乔 鲍勃 <正文> 1 乔·拜登 1 0 2 鲍比·肯尼迪 0 1 3 乔·鲍勃·布里格斯 1 1

但我真正想要的是一个包含分类值的“类型”列:Joe、Bob 或两者。

为此,我添加了一列来组合 boolean 值,然后替换了值:

df["Type"] = df["Joe"].astype(str) + df["Bob"].astype(str)

<表类=“s-表”> <标题> 0 姓名 乔 鲍勃 类型 <正文> 1 乔·拜登 1 0 10 2 鲍比·肯尼迪 0 1 1 3 乔·鲍勃·布里格斯 1 1 11

df['Type'] = df.Type.astype('str') df['Type'].replace({'11': 'Both', '10': 'Joe','1': 'Bob'}, inplace=True)

<表类=“s-表”> <标题> 0 姓名 乔 鲍勃 类型 <正文> 1 乔·拜登 1 0 乔 2 鲍比·肯尼迪 0 1 鲍勃 3 乔·鲍勃·布里格斯 1 1 两者

这感觉很笨拙。大家有更好的办法吗?

谢谢!

最佳答案

您可以使用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/

相关文章:

python - 基于 2 个整数列表提取字符串。 Python

python - 饼图切片 python 上的行值

java - 使用 Spark DataFrame 发展模式

python - 带有字典的 pandas 中的列到行?

python - 在 Python 中查找重复矩阵?

python - Pandas 日期时间聚合

python - Pandas groupby-聚合在 shift() 操作后不起作用

python - 如果另一个文件夹中的 .xls 同名,如何打开文件夹中的 .txt

python - 为什么 ThreadPool 中的线程不异步运行?

python - 如何从 Anaconda 更新 Pandas,最后是否可以使用 eclipse