热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用带有列名称和值的字典对熊猫数据框进行一键编码

我目前有以下代码,使用字典对熊猫数据框进行一次编码,其中的键是要素名

我目前有以下代码,使用字典对熊猫数据框进行一次编码,其中的键是要素名称,值是要素值列表。

def dummy_encode_dataframe(self,df,dummy_values_dict):
for (feature,dummy_values) in sorted(dummy_values_dict.items()):
for dummy_value in sorted(dummy_values):
dummy_name = u'%s_%s' % (feature,dummy_value)
df[dummy_name] = (df[feature] == dummy_value).astype(float)
del df[feature]
return df

dummy_values_dict具有以下结构:

feature name (key) list of possible values (strings)
--------- ---------------------------------
F1 ['A','B','C','MISSING']
F2 ['D','E','F','MISSING']
F3 ['G','H','I']

带有示例输入/输出:

df (one row):
====
F1 F2 F3
--- ----- -----
'A' 'Q' 'H'

预期输出:

df_output:
====
F1_A F1_B F1_C F1_MISSING F2_D F2_E F2_F F2_MISSING F3_G F3_H F3_I
--- ---- ----- --------- ---- ---- ---- ---------- ---- ---- -----
1 0 0 0 0 0 0 0 0 1 0

问题在于for循环需要太长时间才能运行。有什么优化方法吗?

更新1:来自有关在scikit-learn中使用OneHotEncoder的评论...
您能否详细说明这段代码以获得所需的输出?

import pandas as pd
df = pd.DataFrame(columns=['F1','F2','F3'])
df.loc[0] = ['A','Q','H']
dummy_values_dict = { 'F1': ['A','MISSING'],'F2': ['D','F3': ['G','I'] }
# import OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
categorical_cols = sorted(dummy_values_dict.keys())
# instantiate OneHotEncoder
# todo: encoding...


也许这个问题措辞不好。我设法使用下面的代码找到了一个更优化的实现(可能有更好的实现):

import pandas as pd
import numpy as np
def dummy_encode_dataframe_optimized(df,dummy_values_dict):
column_headers = np.concatenate(np.array(
[np.array([k + '_value_' + s
for s in sorted(dummy_values_dict[k])])
for k in sorted(dummy_values_dict.keys())]),axis=0)
feature_values = [str(feature) + '_value_' + str(df[feature][0])
for feature in dummy_values_dict.keys()]
one_hot_encode_vector = np.vectorize(lambda x: float(1) if x in feature_values else float(0))(column_headers)
untouched_df = df.drop(df.ix[:,dummy_values_dict.keys()].head(0).columns,axis=1)
hot_encoded_df = pd.concat(
[
untouched_df,pd.DataFrame(
[one_hot_encode_vector],index=untouched_df.index,columns=column_headers
)
],axis=1
)
return hot_encoded_df
df = pd.DataFrame(columns=['F1','F2','F3'])
df.loc[0] = ['A','Q','H']
dummy_values_dict = { 'F1': ['A','B','C','MISSING'],'F2': ['D','E','F','F3': ['G','H','I'] }
result = dummy_encode_dataframe_optimized(df,dummy_values_dict)

,

pd.get_dummies应该适合您的情况,但是首先我们需要将不在字典中的所有值都设置为NaN

df = pd.DataFrame({'F1': ['A','F2': [
'Q','I',5]})
# F1 F2 F3
# 0 A Q G
# 1 B E H
# 2 C F I
# 3 MISSING MISSING 5
dummy_values_dict = {'F1': ['A','F2': [
'D','I']}

我们可以将所有其他值设置为np.nan

for col in df.columns:
df.loc[~df[col].isin(dummy_values_dict[col]),col] = np.nan
print(df)
# F1 F2 F3
# 0 A NaN G
# 1 B E H
# 2 C F I
# 3 MISSING MISSING NaN

然后我们可以使用pd.get_dummies来完成这项工作:

print(pd.get_dummies(df))
# F1_A F1_B F1_C F1_MISSING F2_E F2_F F2_MISSING F3_G F3_H F3_I
# 0 1 0 0 0 0 0 0 1 0 0
# 1 0 1 0 0 1 0 0 0 1 0
# 2 0 0 1 0 0 1 0 0 0 1
# 3 0 0 0 1 0 0 1 0 0 0

请注意,如果我们没有一个值(例如“ F2”列中的“ D”),则不会出现“ F2_D”列,但是如果您确实需要该列,可以很容易地解决该问题


推荐阅读
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
author-avatar
我们的北京宫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有