One-hot 编码多级列数据

2024-01-09

我有以下数据框,其中包含有关不同主题的特征的记录:

ID   Feature
-------------------------
1    A
1    B
2    A
1    A
3    B
3    B
1    C
2    C
3    D

我想获得另一个(聚合的?)数据帧,其中每一行代表一个特定主题,并且有所有单热编码功能的详尽列表:

ID   FEATURE_A FEATURE_B FEATURE_C FEATURE D
--------------------------------------------
1    1         1         1         0
2    1         0         1         0
3    0         1         0         0

如何用Python(Pandas)实现它?

奖励:如何实现一个版本,其中特征列包含出现次数,而不仅仅是二进制标志?


Use join http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html with get_dummies http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html, then groupby http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html并聚合max:

df =df[['ID']].join(pd.get_dummies(df['Feature']).add_prefix('FEATURE_')).groupby('ID').max()
print (df)
    FEATURE_A  FEATURE_B  FEATURE_C  FEATURE_D
ID                                            
1           1          1          1          0
2           1          0          1          0
3           0          1          0          1

Detail:

print (pd.get_dummies(df['Feature']))
   A  B  C  D
0  1  0  0  0
1  0  1  0  0
2  1  0  0  0
3  1  0  0  0
4  0  1  0  0
5  0  1  0  0
6  0  0  1  0
7  0  0  1  0
8  0  0  0  1

另一种解决方案是多标签二值化器 http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html and DataFrame构造函数:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df['Feature']),
                   columns=['FEATURE_' + x for x in mlb.classes_], 
                   index=df.ID).max(level=0)
print (df1)
    FEATURE_A  FEATURE_B  FEATURE_C  FEATURE_D
ID                                            
1           1          1          1          0
2           1          0          1          0
3           0          1          0          1

Timings:

np.random.seed(123)
N = 100000
L = list('abcdefghijklmno'.upper()) 
df = pd.DataFrame({'Feature': np.random.choice(L, N),
                   'ID':np.random.randint(10000,size=N)})

def jez(df):
    mlb = MultiLabelBinarizer()
    return pd.DataFrame(mlb.fit_transform(df['Feature']),
                   columns=['FEATURE_' + x for x in mlb.classes_], 
                   index=df.ID).max(level=0)


#jez1
In [464]: %timeit (df[['ID']].join(pd.get_dummies(df['Feature']).add_prefix('FEATURE_')).groupby('ID').max())
10 loops, best of 3: 39.3 ms per loop

In [465]: %timeit (jez(df))
10 loops, best of 3: 138 ms per loop

#Scott Boston1
In [466]: %timeit (df.set_index('ID')['Feature'].str.get_dummies().add_prefix('FEATURE_').max(level=0))
1 loop, best of 3: 1.03 s per loop

#wen1
In [467]: %timeit (pd.crosstab(df.ID,df.Feature).gt(0).astype(int).add_prefix('FEATURE '))
1 loop, best of 3: 383 ms per loop

#wen2
In [468]: %timeit (pd.get_dummies(df.drop_duplicates().set_index('ID')).sum(level=0))
10 loops, best of 3: 47 ms per loop

Caveat

The results do not address performance given the proportion of Feature and ID, which will affect timings a lot for some of these solutions.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

One-hot 编码多级列数据 的相关文章

随机推荐

  • java xml 删除项目

    我有一个非常简单的 xml 文件 我想创建一个简单的函数来从中删除项目 这是我的 xml 文件
  • 为什么我们需要将压缩对象转换为列表

    我正在尝试完成一个数据营练习 其中我需要将 2 个列表转换为zip object然后进入一个dict最终得到一个dataframe使用熊猫 但是 如果我使用zip 对列表进行函数并将它们转换为字典 然后转换为数据框 我没有得到任何错误 但简
  • 如何检查 bash 脚本中是否以 root 身份运行

    我正在编写一个需要 root 级别权限的脚本 并且我想这样做 以便如果该脚本不以 root 身份运行 它只是回显 请以 root 身份运行 并退出 这是我正在寻找的一些伪代码 if whoami root then echo Please
  • 如何使用 Excel 在 Outlook 365 Exchange 中引用组或共享日历?

    我正在尝试让多个用户能够使用 Excel 将约会添加到共享日历 以下代码对我有用 我拥有共享日历 它位于 Outlook365 中的我的日历文件夹中 Sub CreateAppt Const olFolderCalendar 9 Const
  • 如何在 Dart 中创建一个空白的 Future + 如何返回当前正在进行的 Future?

    我正在尝试创建一个服务器端 Dart 类来执行各种与数据相关的任务 所有这些任务都依赖于首先初始化的数据库 问题是数据库的初始化是异步发生的 返回 Future 我首先尝试将初始化代码放入构造函数中 但放弃了这种方法 因为它似乎不可行 我现
  • 如何通过java代码在属性文件中写入值

    我有一个问题 我有一个属性文件 我想在该文件中存储一些值 并在需要时在代码中实现 有什么办法可以做到这一点吗 我在用Properties类来做到这一点 使用加载属性文件java util Properties http docs oracl
  • 为什么我无法将 firebase 电子邮件密码登录链接到 google 登录?

    我已经成功实施了Firebase Google 登录 https firebase google com docs auth android google signin在我的 Android 应用程序中 它工作正常 但是 我希望用户也使用电
  • 获取与 SIM 卡关联的电话号码

    如何获取与 CMDA 和 GSM 的 SIM 卡关联的电话号码以及服务提供商名称 Android TelephonyManager 可能不会在所有情况下都返回号码 如果运营商未设置号码 它可能不会返回号码 您必须创建一个验证场景 要求用户输
  • 如何向 Spark RDD 添加新列?

    我有一个 RDDMANY列 例如 hundreds 如何在此 RDD 的末尾添加一列 例如 如果我的 RDD 如下所示 123 523 534 893 536 98 1623 98472 537 89 83640 9265 7297 983
  • 更新(重新部署)现有的 azure webjob

    我创建了一个按需网络作业 在管理门户中 没有上传新 zip 或更新它的选项 我可以删除现有的网络作业并创建一个新的网络作业 但我想保留我的日志 有没有办法重新部署它 覆盖旧版本 维护日志 您可以通过 FTP 连接到 Webjob 所在的网站
  • 为什么 data-* 属性比普通 ID 属性更适合用于元素选择?

    Cypress https docs cypress io guides references best practices html Selecting Elements和许多其他关于测试 Web 应用程序的帖子建议依赖像这样的数据属性d
  • 原深感摄像头的拍摄范围是多少?

    前置原深感摄像头可以检测到的最小和最大距离是多少 When 检测深度数据 https developer apple com documentation avfoundation cameras and media capture stre
  • WPF - 延迟多重绑定

    我有一个多重绑定 看起来像这样
  • 如何在 Postgres 中获取时间间隔的平均值

    我正在使用 PostgreSQL 9 6 我有一个这样的表 mac sn loc time date vin1 vin2 vin3 1a34 4as11111111 aaaa 7 06 18 1 1 2018 447 42 472 32 6
  • 如何从 xcode 获取自己的应用程序版本?

    我想知道是否有办法在将其放入 xCode 中的 Summary 选项卡后 在代码中获取自己的应用程序版本 一种方法似乎是搜索Info plist for CFBundleVersion关键 但是还有其他更简单 更方便的方法吗 您可以在主包中
  • VB.NET LINQ 按多列分组

    我有以下 LINQ 代码 该代码有语法错误 但我不知道如何修复它 Dim query From row In mainDatatable AsEnumerable the syntax Error is in the following l
  • 保持当前页面呈现,直到加载下一页

    我有一个基于 WebView loadUrl http www example com http www example com 当用户单击 URL 时 默认行为是立即显示空白页面 等待页面加载 然后显示此页面 我设法显示启动屏幕来代替空白
  • POSIX TIMER - 有多个计时器

    我试图在我的系统中有两个计时器用于两个不同的目的 但我不明白为什么它不起作用 有人可以帮助我吗 另外 处理程序代码是否应该是最低限度的 以便任务本身不会干扰滴答声 我还可以定义单独的处理程序吗 include
  • 如何在客户注册表中添加地址字段?

    我使用的是magento 1 6 我想在客户注册表上显示地址字段 我从 register phtml 中删除了以下几行 但它不起作用 所以我该怎么做 如果您使用的是 magento 1 6 或更高版本 并且只需在customers form
  • One-hot 编码多级列数据

    我有以下数据框 其中包含有关不同主题的特征的记录 ID Feature 1 A 1 B 2 A 1 A 3 B 3 B 1 C 2 C 3 D 我想获得另一个 聚合的 数据帧 其中每一行代表一个特定主题 并且有所有单热编码功能的详尽列表 I