如何为含嵌套列表的DataFrame列新增统计元素出现次数总和的列
嘿,针对你这个包含嵌套列表的大型DataFrame,我来分享几个实用的解决方案,帮你快速新增统计各类元素(D/C/S)出现次数的列!
先明确需求
你的value列里每个元素是嵌套列表,每个子列表格式是[起始值, 结束值, 类型],我们需要统计每行里D、C、S各自出现的次数,新增一列(或多列)来存储这些统计结果。
方法一:基础实现(适合快速验证)
首先要注意:CSV文件里的嵌套列表其实是字符串格式,所以第一步得把它转换成真正的Python列表对象,然后再统计。
import pandas as pd from ast import literal_eval from collections import Counter # 读取你的CSV文件(替换成你的文件名) df = pd.read_csv("your_data.csv") # 将字符串形式的列表转换为实际列表(安全替代eval()) df["value"] = df["value"].apply(literal_eval) # 定义统计函数:遍历每行的嵌套列表,统计各类型次数 def count_type_occurrences(nested_list): # 提取所有子列表的第三个元素(类型) types = [item[2] for item in nested_list] # 用Counter计数并转为字典格式 return dict(Counter(types)) # 新增type_counts列,存储每行的类型计数字典 df["type_counts"] = df["value"].apply(count_type_occurrences)
运行后,type_counts列会是这样的格式:{"D":2, "C":3, "S":4},清晰展示每行各类型的出现次数。如果需要把每个类型拆成单独列(比如D_count、C_count),可以加这一步:
# 将字典列展开为单独的计数列,空值补0并转为整数 df = df.join(pd.json_normalize(df["type_counts"]).fillna(0).astype(int))
方法二:高效优化版(适合12k+行的大型数据集)
上面的apply是逐行处理,数据量大时速度会慢。我们可以用Pandas的矢量化操作来提速:
import pandas as pd from ast import literal_eval df = pd.read_csv("your_data.csv") df["value"] = df["value"].apply(literal_eval) # 1. 将嵌套列表拆分成多行(每行对应一个子列表) exploded_df = df.explode("value") # 2. 提取每个子列表的类型 exploded_df["type"] = exploded_df["value"].str[2] # 3. 按原行索引分组,统计各类型的出现次数 counts_df = exploded_df.groupby(exploded_df.index)["type"].value_counts().unstack(fill_value=0) # 4. 给计数列加后缀,合并回原DataFrame df = df.join(counts_df.add_suffix("_count"))
这个方法利用Pandas的内置分组统计功能,比逐行apply快很多,适合你的12k+行数据集。
示例输出
假设原DataFrame某行的value是[[1,92,"D"],[93,93,"C"],[94,113,"S"]],新增列后会得到:
type_counts:{"D":1, "C":1, "S":1}- 或者单独列:
D_count=1, C_count=1, S_count=1
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

