商城首页欢迎来到中国正版软件门户

您的位置:首页 >Pandas统计字典列列表首元素非空数

Pandas统计字典列列表首元素非空数

  发布于2025-08-28 阅读(0)

扫一扫,手机访问

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 的每一行)中非缺失值的个数。

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(),代码略微复杂,但通常在处理大数据集时效率更高。 选择哪种方法取决于具体的数据规模和性能需求。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注