Pandas DataFrame:高效将多列行值整合为列表

碧海醫心
发布: 2025-12-02 11:02:02
原创
543人浏览过

Pandas DataFrame:高效将多列行值整合为列表

本教程详细介绍了如何使用pandas高效地将dataframe中的多列数据合并成一个新的列表值列。通过利用`iloc`进行列选择和`apply(list, axis=1)`函数,可以避免传统循环的性能瓶颈,快速实现数据结构的转换,为后续的数据分析或与其他dataframe的合并操作提供便利。

引言

在数据处理和分析中,我们经常会遇到需要将DataFrame中代表同一实体不同属性的多个列值整合到一个列表中的场景。例如,一个用户在不同时间点的多个评分、一个产品在不同维度上的特征值,或者一个事件的多个测量结果。将这些分散的列数据转换为单一的列表形式,不仅能简化数据结构,方便后续的序列操作,也为与其他数据源进行合并或构建更复杂的数据模型提供了便利。本文将详细介绍一种使用Pandas库高效、简洁地实现这一数据转换的方法,避免了传统循环带来的性能开销。

原始数据结构

假设我们有一个典型的Pandas DataFrame,其中包含一个唯一标识符id、一个名称name以及多个数值列,例如value1、value2和value3。这些数值列代表了同一实体(由id和name标识)的不同属性值。

import pandas as pd

# 原始DataFrame数据
data = {
    'id': [1, 2, 3],
    'name': ['AAA', 'BBB', 'CCC'],
    'value1': [1.0, 2.0, 3.0],
    'value2': [1.5, 2.3, 3.6],
    'value3': [1.8, 2.5, 3.7]
}
df = pd.DataFrame(data)

print("原始DataFrame:")
print(df)
登录后复制

输出的原始DataFrame如下所示:

   id name  value1  value2  value3
0   1  AAA     1.0     1.5     1.8
1   2  BBB     2.0     2.3     2.5
2   3  CCC     3.0     3.6     3.7
登录后复制

目标数据结构

我们的目标是将value1、value2、value3这三列的数据,在每一行中合并成一个列表,并将这个列表存储在一个新的名为value的列中。同时,我们希望保留原始DataFrame中的标识列,即id和name。

期望的输出DataFrame结构如下:

   id name            value
0   1  AAA  [1.0, 1.5, 1.8]
1   2  BBB  [2.0, 2.3, 2.5]
2   3  CCC  [3.0, 3.6, 3.7]
登录后复制

核心转换方法:使用 iloc 和 apply

Pandas库提供了强大的向量化操作,能够高效地处理DataFrame,避免了使用低效的Python循环。实现上述数据转换的关键在于结合使用DataFrame.iloc进行精确的列选择,以及DataFrame.apply()方法配合axis=1(按行应用)。

bee餐饮点餐外卖小程序
bee餐饮点餐外卖小程序

bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置

bee餐饮点餐外卖小程序 1
查看详情 bee餐饮点餐外卖小程序

整个转换过程可以分解为以下几个步骤:

  1. 选择需要合并的数值列: 我们使用df.iloc[:, 2:]来选择从第三列(索引为2)开始的所有列。在我们的示例中,这精确地对应了value1、value2和value3。iloc是基于整数位置的索引,非常适合批量选择连续的列。

  2. 将每行的选定列值转换为列表: 对第一步中选定的子DataFrame (df.iloc[:, 2:]) 调用apply(list, axis=1)。apply()方法会将每一行的数据作为一个整体传递给指定的函数。在这里,list()函数将该行的所有值打包成一个Python列表。axis=1参数至关重要,它指示apply操作是按行进行的,而不是按列。

  3. 为新生成的Series命名: apply操作会返回一个Pandas Series,其中每个元素都是一个列表。为了方便后续与原始标识列进行合并,我们使用.rename('value')方法将其命名为value,这与我们目标列的名称一致。

  4. 与标识列进行合并: 最后,使用pd.concat()函数将原始DataFrame中的标识列(df.iloc[:, :2],即id和name)与新生成的value Series按列(axis=1)进行合并。pd.concat()是Pandas中用于连接DataFrame或Series的强大工具

完整示例代码

下面是实现上述转换的完整Python代码:

import pandas as pd

# 原始DataFrame数据
data = {
    'id': [1, 2, 3],
    'name': ['AAA', 'BBB', 'CCC'],
    'value1': [1.0, 2.0, 3.0],
    'value2': [1.5, 2.3, 3.6],
    'value3': [1.8, 2.5, 3.7]
}
df = pd.DataFrame(data)

print("原始DataFrame:")
print(df)

# 核心转换逻辑
# 1. 选取标识列 (id, name)。iloc[:, :2] 选择从第0列到第1列(不包括第2列)
identifier_cols = df.iloc[:, :2]

# 2. 选取需要合并的数值列 (value1, value2, value3)。iloc[:, 2:] 选择从第2列到最后一列
#    并按行转换为列表,然后将新Series命名为'value'
value_list_series = df.iloc[:, 2:].apply(list, axis=1).rename('value')

# 3. 将标识列和新的列表列按列 (axis=1) 合并
transformed_df = pd.concat([identifier_cols, value_list_series], axis=1)

print("\n转换后的DataFrame:")
print(transformed_df)
登录后复制

输出结果

执行上述代码后,我们将得到以下转换后的DataFrame:

转换后的DataFrame:
   id name            value
0   1  AAA  [1.0, 1.5, 1.8]
1   2  BBB  [2.0, 2.3, 2.5]
2   3  CCC  [3.0, 3.6, 3.7]
登录后复制

注意事项与扩展

  • 列选择的灵活性:
    • 如果需要合并的列不是连续的,或者列名是已知且不连续的,可以使用列名列表进行选择,例如 df[['value1', 'value3', 'value5']]。
    • 或者使用 df.loc[:, ['value1', 'value2', 'value3']] 来精确指定列。
  • 处理非数值数据: 尽管本例中是数值数据,apply(list, axis=1)同样适用于混合数据类型。它会直接将行中的所有值按照其原始类型打包成列表。
  • 性能考量: 相比于显式地迭代DataFrame的行(例如使用df.iterrows()),apply(..., axis=1)在底层通常会利用Pandas的C语言优化,因此对于大型DataFrame,这种方法远比纯Python循环高效。
  • 移除不需要的列: 如果最终只需要name和value列,而id列不再需要,可以在转换完成后使用transformed_df.drop('id', axis=1)来删除它,或者直接通过选择需要的列来创建最终DataFrame,例如 final_df = transformed_df[['name', 'value']]。
  • 数据类型一致性: 确保要合并的列数据类型兼容,或者在合并前进行适当的类型转换,以避免列表内部数据类型混乱。

总结

通过结合iloc的精确列选择和apply(list, axis=1)的行级列表化能力,Pandas提供了一种优雅且高效的方式来将DataFrame中的多列数据聚合为一个列表值列。这种转换不仅简化了数据结构,也为后续的数据分析、数据集成以及更复杂的特征工程任务奠定了坚实的基础,同时避免了传统循环带来的性能开销,是Pandas数据处理中一项非常实用的技巧。

以上就是Pandas DataFrame:高效将多列行值整合为列表的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号