如何创建多分类数据集?Python高效处理多标签重复输入DataFrame的优化方案
问题描述
我有如下所示的DataFrame:
df = pd.DataFrame(np.array([['I am a bear', 'Animal'], ['I am a bird', 'Bird'], ['I am a Bat', 'Animal'],['I am a Bat', 'Bird']]), columns=['Title', 'Task'])
对应的表格:
| Title | Task |
|---|---|
| I am a bear | Animal |
| I am a bird | Bird |
| I am a Bat | Animal |
| I am a Bat | Bird |
由于同一输入('I am a Bat')对应不同的类标签,这属于多标签任务。我目前的处理方式是对重复项进行分组,然后添加包含所有标签的新列,但该操作较为繁琐。请问是否存在更具Python风格(Pythonic)的实现方式?
预期输出:
| Title | Label1 (Animal) | Label2 (Bird) |
|---|---|---|
| I am a bear | 1 | 0 |
| I am a bird | 0 | 1 |
| I am a Bat | 1 | 1 |
解决方案
嘿,这个需求完全不用手动折腾分组!用pandas的内置方法就能轻松实现,两种Pythonic的方式供你选择:
方法一:使用pivot_table
pivot_table可以直接帮你把Task列的不同值转成新列,同时用聚合函数标记是否存在该标签:
import pandas as pd import numpy as np # 原始DataFrame df = pd.DataFrame(np.array([['I am a bear', 'Animal'], ['I am a bird', 'Bird'], ['I am a Bat', 'Animal'],['I am a Bat', 'Bird']]), columns=['Title', 'Task']) # 生成透视表,aggfunc用lambda返回1表示存在该标签,fill_value填充0 result = df.pivot_table(index='Title', columns='Task', aggfunc=lambda x: 1, fill_value=0).reset_index() # 重命名列名以匹配预期格式 result.columns = ['Title', 'Label1 (Animal)', 'Label2 (Bird)'] print(result)
方法二:get_dummies + groupby.max()
先对Task列做独热编码,再按Title分组取最大值(确保同一个Title的所有标签都被保留为1):
import pandas as pd import numpy as np df = pd.DataFrame(np.array([['I am a bear', 'Animal'], ['I am a bird', 'Bird'], ['I am a Bat', 'Animal'],['I am a Bat', 'Bird']]), columns=['Title', 'Task']) # 对Task列生成独热编码 dummies_df = pd.get_dummies(df, columns=['Task']) # 按Title分组,取最大值(同一Title下的标签只要出现过就保留1) result = dummies_df.groupby('Title').max().reset_index() # 重命名列名 result.columns = ['Title', 'Label1 (Animal)', 'Label2 (Bird)'] print(result)
这两种方法都避免了手动循环或繁琐的分组操作,完全利用pandas的高效内置函数,非常符合Pythonic的简洁风格~
内容的提问来源于stack exchange,提问作者user42
相关产品推荐
相关产品推荐

