
本文介绍了如何使用 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)代码解释:
- [y['list_A'][0] for y in x]: 这是一个列表推导式,它遍历 df['column_dic'] 中的每个字典 x,然后从每个字典中提取 list_A 列表的第一个元素 y['list_A'][0]。
- pd.notna(...): pd.notna() 函数用于检查列表中的每个元素是否为非缺失值(即不是 NaN 或 None)。 它返回一个布尔值列表,True 表示非缺失值,False 表示缺失值。
- .sum(): 由于 True 在数值上等同于 1,False 等同于 0,所以对布尔值列表求和,即可得到非缺失值的个数。
- [... 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)代码解释:
- df['column_dic'].explode(): 将 column_dic 列中的列表展开,每个元素变成单独的一行。
- .str.get('list_A'): 对于展开后的每一行,使用 str.get('list_A') 获取字典中键为 'list_A' 的值(即列表)。
- .str[0]: 获取列表中索引为 0 的元素。
- .groupby(level=0): 按照原始 DataFrame 的索引进行分组,level=0 表示按照第一层索引分组。
- .count(): 统计每个分组中非缺失值的个数。
总结
这两种方法都能够有效地统计 DataFrame 字典列中列表首个元素的非缺失值个数。 第一种方法使用列表推导式,代码简洁易懂,但当数据量较大时,性能可能稍逊。 第二种方法使用 Series.explode() 和 DataFrameGroupBy.count(),代码略微复杂,但通常在处理大数据集时效率更高。 选择哪种方法取决于具体的数据规模和性能需求。










