
本教程详细介绍了如何在pandas dataframe中将包含numpy数组的“键”和“值”列展开为新的独立列。文章提供了两种核心场景的解决方案:当所有行的“键”数组相同时,以及当“键”数组在不同行之间存在差异时。通过使用pandas的`join`、`dataframe`构造函数和列表推导等功能,可以高效地将数组内容转换为结构化的dataframe新列,并处理可能出现的缺失值。
在数据分析和处理中,我们经常会遇到DataFrame的某一列或几列中存储着数组(如NumPy数组或Python列表)的情况。当这些数组包含结构化的信息,例如键值对,并且我们希望将这些键作为新的列名,将对应的值作为新列的数据时,就需要进行列的展开和重构。本教程将深入探讨如何使用Pandas库实现这一目标,涵盖两种常见的场景:键在所有行中保持一致,以及键在不同行中可能不一致。
当DataFrame中存储键的NumPy数组在所有行中都相同时,我们可以利用这一特性进行高效的转换。
假设我们有一个DataFrame,其中包含两列keys和values,它们都是NumPy数组类型,并且keys列在所有行中的内容都相同。
import pandas as pd
import numpy as np
source_df = pd.DataFrame(
[
['data_A1', 'data_B1', np.array(['key1', 'key2', 'key3']), np.array(['value1a', 'value2a', 'value3a'])],
['data_A2', 'data_B2', np.array(['key1', 'key2', 'key3']), np.array(['value1b', 'value2b', 'value3b'])],
['data_A3', 'data_B3', np.array(['key1', 'key2', 'key3']), np.array(['value1c', 'value2c', 'value3c'])]
],
columns=['Col A', 'Col B', 'keys', 'values']
)
print("原始 DataFrame:")
print(source_df)输出的source_df将如下所示:
原始 DataFrame:
Col A Col B keys values
0 data_A1 data_B1 [key1, key2, key3] [value1a, value2a, value3a]
1 data_A2 data_B2 [key1, key2, key3] [value1b, value2b, value3b]
2 data_A3 data_B3 [key1, key2, key3] [value1c, value2c, value3c]我们的目标是将其转换为:
Col A Col B key1 key2 key3 0 data_A1 data_B1 value1a value2a value3a 1 data_A2 data_B2 value1b value2b value3b 2 data_A3 data_B3 value1c value2c value3c
在这种情况下,我们可以通过以下步骤实现转换:
# 方案一:创建新的DataFrame并合并
output_df_method1 = (source_df.drop(columns=['keys', 'values'])
.join(pd.DataFrame(source_df['values'].
tolist(),
columns=source_df['keys'].iloc[0]))
)
print("\n方案一转换后的 DataFrame:")
print(output_df_method1)代码解析:
Musho
AI网页设计Figma插件
76
查看详情
如果你希望直接在原始DataFrame上进行修改,可以使用pop方法结合赋值操作:
# 方案二:原地修改 DataFrame
# 为了演示,我们先复制一份原始数据
df_in_place = source_df.copy()
# 使用 pop 移除 'keys' 和 'values' 列,并获取它们的内容
# pop('keys') 会返回 'keys' 列的 Series,其 .iloc[0] 提供了列名
# pop('values') 会返回 'values' 列的 Series,其 .tolist() 提供了数据
df_in_place[df_in_place.pop('keys').iloc[0]] = pd.DataFrame(df_in_place.pop('values').tolist())
print("\n方案二原地修改后的 DataFrame:")
print(df_in_place)代码解析:
当keys列中的NumPy数组在不同行之间可能存在差异时,上述方法就不再适用,因为我们无法简单地取第一行的键作为所有列名。在这种情况下,我们需要为每一行独立地构建键值映射。
考虑以下DataFrame,其中keys列在不同行中包含不同的键:
source_df_non_identical = pd.DataFrame(
[
['data_A1', 'data_B1', np.array(['key1', 'key2', 'key3']), np.array(['value1a', 'value2a', 'value3a'])],
['data_A2', 'data_B2', np.array(['key3', 'key4', 'key1']), np.array(['value3b', 'value4b', 'value1b'])],
['data_A3', 'data_B3', np.array(['key5', 'key1']), np.array(['value5c', 'value1c'])]
],
columns=['Col A', 'Col B', 'keys', 'values']
)
print("\n原始 DataFrame (键不一致):")
print(source_df_non_identical)输出的source_df_non_identical将如下所示:
原始 DataFrame (键不一致):
Col A Col B keys values
0 data_A1 data_B1 [key1, key2, key3] [value1a, value2a, value3a]
1 data_A2 data_B2 [key3, key4, key1] [value3b, value4b, value1b]
2 data_A3 data_B3 [key5, key1] [value5c, value1c]目标是将其转换为:
Col A Col B key1 key2 key3 key4 key5 0 data_A1 data_B1 value1a value2a value3a NaN NaN 1 data_A2 data_B2 value1b NaN value3b value4b NaN 2 data_A3 data_B3 value1c NaN NaN NaN value5c
注意,对于某行中不存在的键,对应的新列位置将填充NaN。
当键不一致时,我们需要为每一行创建键值映射(字典),然后将这些字典的列表转换为DataFrame。Pandas会智能地将所有唯一的键作为列名,并对缺失的键填充NaN。
output_df_non_identical = (source_df_non_identical.drop(columns=['keys', 'values'])
.join(pd.DataFrame([dict(zip(k, v)) for k, v in
zip(source_df_non_identical['keys'],
source_df_non_identical['values'])]))
)
print("\n键不一致场景转换后的 DataFrame:")
print(output_df_non_identical)代码解析:
通过以上两种方案,无论keys列中的数组是完全一致还是各不相同,我们都能够灵活高效地将DataFrame中包含NumPy数组的列展开并重构为新的独立列,极大地提升了数据处理的灵活性和便利性。理解这些方法背后的逻辑,有助于在面对复杂数据结构时,选择最合适的处理策略。
以上就是Pandas DataFrame中NumPy数组列的展开与重构为新列的详细内容,更多请关注其它相关文章!
相关文章:
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
新三国志曹操传110级星符试炼夏侯渊极难攻略
韩小圈电脑版在线入口_网页版免费登录地址
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
必由学官方平台入口 必由学在线课堂登录地址
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
windows10怎么查看本机ip_windows10命令提示符ipconfig使用
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
内存疯狂猛猛涨价:主板销量直接腰斩!
期待已久:小米17 Ultra、小米首款NAS本月登场
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
mc.js游戏直达 mc.js网页免下载版本秒进地址
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
Golang如何使用net/url解析URL_Golang URL解析与处理方法
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
曝R星经典之作开发图 设计简陋但信息密集!
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
J*a如何实现并发下载文件_J*a多线程IO性能优化案例
CSS图片焦点样式实现教程:理解与应用tabindex属性
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
支付宝如何设置安全保护_支付宝安全设置的全面教程
J*aScript打印功能_j*ascript输出控制
cad如何更改注释性对象的比例_cad注释性比例调整方法
J*aScript动态修改指定div内所有a标签样式指南
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
汽水音乐在线版入口_汽水音乐网页播放手册
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
c++20的std::jthread是什么_c++可中断线程与RAII式管理
在哪找SublimeJ远程工具_SFTP插件配置教程
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
Go RPC HTTP服务正确实现与常见陷阱解析
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
怎么在mac上运行html代码_mac运行html代码方法【指南】
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示