Pandas:统计DataFrame字典列中列表首个元素的非缺失值个数

霞舞
发布: 2025-08-02 15:42:11
原创
209人浏览过

pandas:统计dataframe字典列中列表首个元素的非缺失值个数

本文介绍了如何使用 Pandas 统计 DataFrame 中字典列里,嵌套列表(特别是'list_A')的首个元素(索引为0)的非缺失值(非Null值)的个数。通过示例代码,详细展示了两种实现方法,帮助读者理解并掌握在 Pandas 中处理复杂数据结构的技巧。

方法一:列表推导式与 pd.notna()

此方法利用列表推导式提取每个字典中 'list_A' 的第一个元素,然后使用 pd.notna() 函数判断是否为非缺失值,最后使用 sum() 函数统计 True 的个数。

import pandas as pd

data = [{"list_A": [2.93, 4.18, 4.18, None, 1.57, 1.57, 3.92, 6.27, 2.09, 3.14, 0.42, 2.09],
         "list_B": [820, 3552, 7936, None, 2514, 4035, 6441, 15379, 2167, 6147, 3322, 1177]},
        {"list_A": [2.51, 3.58, 3.58, None, 1.34, 1.34, 3.36, 5.37, 1.79, 2.69, 0.36, 1.79],
         "list_B": [820, 3552, 7936, None, 2514, 4035, 6441, 15379, 2167, 6147, 3322, 1177]},
        {"list_A": [None, 5.94, 5.94, None, 2.23, 2.23, 5.57, 8.9, 2.97, 4.45, 0.59, 2.97],
         "list_B": [820, 3552, 7936, None, 2514, 4035, 6441, 15379, 2167, 6147, 3322, 1177]}]

# Create a DataFrame with a column named "column_dic"
df = pd.DataFrame({"column_dic": [data]})


df['count_first_item'] = [pd.notna([y['list_A'][0] for y in x]).sum()
                          for x in df['column_dic']]
print(df)
登录后复制

代码解释:

  1. [y['list_A'][0] for y in x]: 这是一个列表推导式,它遍历 df['column_dic'] 中的每个字典 x,然后从每个字典中提取 list_A 列表的第一个元素 y['list_A'][0]。
  2. pd.notna(...): pd.notna() 函数用于检查列表中的每个元素是否为非缺失值(即不是 NaN 或 None)。 它返回一个布尔值列表,True 表示非缺失值,False 表示缺失值。
  3. .sum(): 由于 True 在数值上等同于 1,False 等同于 0,所以对布尔值列表求和,即可得到非缺失值的个数。
  4. [... for x in df['column_dic']]: 外层的列表推导式确保我们对 df['column_dic'] 中的每个列表都执行上述操作。

方法二:Series.explode()、Series.str.get() 和 DataFrameGroupBy.count()

此方法首先使用 Series.explode() 将字典列表展开为单独的行,然后使用 Series.str.get() 获取 'list_A' 列表,再使用 str[0] 获取第一个元素,最后使用 DataFrameGroupBy.count() 统计每个分组(原始 DataFrame 的每一行)中非缺失值的个数。

序列猴子开放平台
序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0
查看详情 序列猴子开放平台
import pandas as pd

data = [{"list_A": [2.93, 4.18, 4.18, None, 1.57, 1.57, 3.92, 6.27, 2.09, 3.14, 0.42, 2.09],
         "list_B": [820, 3552, 7936, None, 2514, 4035, 6441, 15379, 2167, 6147, 3322, 1177]},
        {"list_A": [2.51, 3.58, 3.58, None, 1.34, 1.34, 3.36, 5.37, 1.79, 2.69, 0.36, 1.79],
         "list_B": [820, 3552, 7936, None, 2514, 4035, 6441, 15379, 2167, 6147, 3322, 1177]},
        {"list_A": [None, 5.94, 5.94, None, 2.23, 2.23, 5.57, 8.9, 2.97, 4.45, 0.59, 2.97],
         "list_B": [820, 3552, 7936, None, 2514, 4035, 6441, 15379, 2167, 6147, 3322, 1177]}]

# Create a DataFrame with a column named "column_dic"
df = pd.DataFrame({"column_dic": [data]})

df['count_first_item'] = (df['column_dic'].explode().str.get('list_A').str[0]
                                          .groupby(level=0).count())
print(df)
登录后复制

代码解释:

  1. df['column_dic'].explode(): 将 column_dic 列中的列表展开,每个元素变成单独的一行。
  2. .str.get('list_A'): 对于展开后的每一行,使用 str.get('list_A') 获取字典中键为 'list_A' 的值(即列表)。
  3. .str[0]: 获取列表中索引为 0 的元素。
  4. .groupby(level=0): 按照原始 DataFrame 的索引进行分组,level=0 表示按照第一层索引分组。
  5. .count(): 统计每个分组中非缺失值的个数。

总结

这两种方法都能够有效地统计 DataFrame 字典列中列表首个元素的非缺失值个数。 第一种方法使用列表推导式,代码简洁易懂,但当数据量较大时,性能可能稍逊。 第二种方法使用 Series.explode() 和 DataFrameGroupBy.count(),代码略微复杂,但通常在处理大数据集时效率更高。 选择哪种方法取决于具体的数据规模和性能需求。

以上就是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号