0

0

如何从包含字典列表的DataFrame列中提取数据并创建新列

霞舞

霞舞

发布时间:2025-11-24 12:56:02

|

548人浏览过

|

来源于php中文网

原创

如何从包含字典列表的DataFrame列中提取数据并创建新列

本文将指导如何在pandas dataframe中,将包含字典列表的列高效地展开为多个新列。我们将探讨两种主要策略,包括直接应用`str`访问器和`apply(pd.series)`,以及通过预设默认字典更稳健地处理空列表和缺失值的方法,以实现结构化的数据转换,从而满足从复杂嵌套数据中提取关键信息的需求。

在数据分析和处理过程中,我们经常会遇到DataFrame的某一列中存储着复杂的数据结构,例如列表嵌套字典。如何将这些嵌套结构展开为独立的列,是数据清洗和特征工程中的常见任务。本教程将详细介绍如何处理一个DataFrame列中包含字典列表的情况,并将其转换为扁平化的DataFrame结构。

问题描述与挑战

假设我们有一个Pandas DataFrame,其中包含一个名为stats的列。这个stats列的每个单元格都可能是一个列表,而列表内部又包含一个或多个字典。更复杂的是,有些列表可能是空的,或者字典中的某些键对应的值可能是None。

输入数据示例:

import pandas as pd

df = pd.DataFrame(
    {
        "stats": [
            [{"city": None, "last_time": 1234567}],
            [],
            [{"city": "Seattle", "last_time": 45678999876}]]
    }
)
print("原始DataFrame:")
print(df)

输出:

原始DataFrame:
                               stats
0  [{'city': None, 'last_time': 1234567}]
1                                    []
2  [{'city': 'Seattle', 'last_time': 45678999876}]

期望输出示例:

我们希望将stats列中的字典键(city和last_time)提取为新的列,并妥善处理空列表和None值,使其在输出中表示为缺失值(如NaN或None)。

      city      last_time
0      NaN     1234567.0
1     None           NaN
2  Seattle  45678999876.0

面临的挑战:

  1. 嵌套结构: stats列中是列表,列表内是字典,需要逐层解包。
  2. 空列表处理: 当stats列的某个元素是空列表[]时,如何避免错误并生成对应的缺失值。
  3. None值处理: 字典中可能包含None值,需要确保它们在新的列中正确表示。
  4. 数据类型一致性: 展开后新列的数据类型需要保持合理。

方法一:直接使用 str 访问器与 apply(pd.Series)

Pandas的Series.str访问器提供了一种便捷的方式来处理包含字符串或类字符串(如列表)的Series。通过结合str[0]和apply(pd.Series),我们可以高效地将列表中的第一个字典展开。

  1. df['stats'].str[0]: 这一步利用str访问器来尝试获取stats列中每个列表的第一个元素。如果列表为空,它将返回NaN。如果列表包含字典,它将返回该字典。
  2. .apply(pd.Series): 接下来,对上一步得到的结果(一个包含字典和NaN的Series)应用pd.Series。pd.Series能够将字典转换为一个Series(或DataFrame的行),其中字典的键成为Series的索引(或DataFrame的列名)。当遇到NaN时,它会生成一个全为NaN的行。

代码示例:

绘蛙-多图成片
绘蛙-多图成片

绘蛙新推出的AI图生视频工具

下载
# 方法一:直接使用 str 访问器与 apply(pd.Series)
output_df_method1 = df["stats"].str[0].apply(pd.Series)

print("\n方法一的输出:")
print(output_df_method1)

输出:

方法一的输出:
      city      last_time
0      NaN     1234567.0
1      NaN           NaN
2  Seattle  45678999876.0

特点分析:

  • 简洁高效: 对于结构相对统一(列表中只有一个字典)的数据,这种方法非常简洁。
  • 缺失值处理: 空列表[]被str[0]处理后会变为NaN,然后apply(pd.Series)会将其对应的city和last_time列都填充为NaN。字典中的None值在city列中转换为NaN,在last_time列中也转换为NaN(因为last_time是数值类型)。

方法二:结合 where 和默认字典处理缺失值

方法一在处理空列表时会将所有对应的输出列都设为NaN。如果我们需要对空列表产生的缺失值有更精细的控制(例如,希望city列显示None而不是NaN),或者希望确保所有行都有一个统一的字典结构以便apply(pd.Series)处理,可以结合使用where和预设的默认字典。

  1. stats_series = df["stats"].str[0]: 同方法一,首先获取列表中的第一个元素。
  2. templ = dict.fromkeys(["city", "last_time"]): 创建一个默认字典模板,包含所有期望的键,值为None。这个模板用于填充那些因空列表而产生的NaN。
  3. stats_series.where(stats_series.notnull(), templ): 使用where方法。如果stats_series中的元素不是NaN(即它是一个字典),则保留原值;如果它是NaN(即原始列表为空),则用templ字典替换它。这样确保了apply(pd.Series)接收到的所有元素都是字典。
  4. .apply(pd.Series): 对处理后的Series应用pd.Series,将字典展开为新列。

代码示例:

# 方法二:结合 where 和默认字典处理缺失值
stats_series = df["stats"].str[0]
# 创建一个默认字典,用于填充空列表对应的行
templ = dict.fromkeys(["city", "last_time"])

# 使用where方法,将NaN值(来自空列表)替换为默认字典
output_df_method2 = stats_series.where(stats_series.notnull(), templ).apply(pd.Series)

print("\n方法二的输出:")
print(output_df_method2)

输出:

方法二的输出:
      city      last_time
0      NaN     1234567.0
1     None           NaN
2  Seattle  45678999876.0

特点分析:

  • 更精细的缺失值控制: 对于原始空列表对应的行,city列现在显示None,而last_time列由于其数值性质仍显示NaN。这更符合某些场景下对缺失值的语义要求。
  • 健壮性: 确保了apply(pd.Series)总是接收到字典对象,避免了因NaN直接传递给apply可能引发的潜在问题(尽管pd.Series通常能很好地处理NaN)。

注意事项与最佳实践

  1. 数据类型转换:
    • 当原始数据中存在整数(如last_time)与None/NaN混合时,Pandas会自动将该列的数据类型提升为浮点数(float64),因为NaN不能存在于整数类型中。
    • city列包含字符串和None,通常会被推断为object类型。
  2. 处理列表中包含多个字典的情况:
    • 上述两种方法都只提取了列表中的第一个字典(通过str[0])。如果列表可能包含多个字典,并且你需要提取所有字典或特定位置的字典,则需要调整策略。
    • 例如,要提取所有字典并创建多行,可以使用列表推导式结合pd.DataFrame.from_records:
      # 示例:如果列表中有多个字典,且需要展开为多行
      all_records = []
      for index, row in df.iterrows():
          if row['stats']: # 检查列表是否为空
              for d in row['stats']:
                  all_records.append(d)
          else:
              all_records.append({'city': None, 'last_time': None}) # 为空列表添加默认行
      multi_row_df = pd.DataFrame.from_records(all_records)
      print("\n处理多字典列表的示例输出 (此处仍按单字典处理):")
      print(multi_row_df)
  3. 性能考虑:
    • 对于非常大的DataFrame,apply方法虽然方便,但在某些情况下可能不如使用列表推导式然后通过pd.DataFrame.from_records或pd.json_normalize(如果数据是JSON格式)创建新的DataFrame高效。
    • pd.json_normalize 是处理JSON-like嵌套数据结构的强大工具,如果你的数据源是JSON字符串或字典的列表,它通常是首选。

总结

本教程介绍了两种将DataFrame中包含字典列表的列展开为新列的有效方法。方法一简洁明了,适用于快速处理,但对空列表的处理结果统一为NaN。方法二通过引入默认字典和where方法,提供了更精细的缺失值控制,尤其是在需要区分None和NaN的场景下更为适用。在实际应用中,选择哪种方法取决于具体的数据结构、对缺失值的处理要求以及性能考量。理解这些方法的原理和适用场景,将有助于您更灵活地处理复杂的数据结构。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

299

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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