基于多数据框列表按行生成频率表的技术咨询
看起来你需要处理一组包含20个DataFrame的列表,为每个k对应的行生成频率表对吧?我给你整理了R和Python两种常用工具的解决方案,直接就能上手:
用R处理(依赖tidyverse工具链)
假设你的20个DataFrame已经存在列表df_list里,咱们一步步来:
先把所有DataFrame合并成一个大表
把分散的DF合并后,后续统计会方便很多,还能标记每行来自哪个原始DF:library(dplyr) library(purrr) # 合并列表里的所有DF,添加df_id列标记来源 combined_df <- bind_rows(df_list, .id = "df_id")为每个k生成h的频率表(DataFrame格式)
如果你的需求是统计每个k值下,不同h标签在20个DF里的出现次数和占比,用这段代码就能得到一个列表,每个元素对应一个k的频率表:k_freq_tables <- combined_df %>% group_by(k) %>% group_split() %>% map(~ .x %>% count(h, name = "frequency") %>% mutate(percentage = frequency / sum(frequency) * 100))比如
k_freq_tables[[1]]就是k=85对应的频率表,包含h标签、出现次数、百分比。如果需要矩阵形式的频率表
要是你偏好矩阵格式,只需要在统计后转个格式就行:k_freq_matrices <- combined_df %>% group_by(k) %>% group_split() %>% map(~ .x %>% count(h, name = "frequency") %>% mutate(percentage = frequency / sum(frequency) * 100) %>% column_to_rownames("h") %>% as.matrix())
用Python处理(依赖pandas)
如果你习惯用Python,同样的逻辑可以这样实现:
合并所有DataFrame
import pandas as pd # df_list是你的20个DataFrame组成的列表 combined_df = pd.concat(df_list, keys=range(len(df_list)), names=["df_id", "row_idx"]).reset_index(drop=True)生成每个k的频率表(DataFrame格式)
写个小函数来统计每组的频率,再用字典存储每个k对应的结果:def generate_freq_table(group): freq = group["h"].value_counts().reset_index() freq.columns = ["h", "frequency"] freq["percentage"] = freq["frequency"] / freq["frequency"].sum() * 100 return freq # 键是k值,值是对应频率表 k_freq_tables = {k: generate_freq_table(group) for k, group in combined_df.groupby("k")}转成矩阵形式
想要矩阵的话,直接把DataFrame转成矩阵即可:k_freq_matrices = {k: table.set_index("h").values for k, table in k_freq_tables.items()}
小提醒
- 如果你的频率表是针对
value列的分布(比如每个k对应的value的频数),只需要把代码里的h替换成value就行。 - 要是原始DataFrame的列名有排版问题(比如你示例里表头和行内容不匹配),记得先把每个DF的列统一调整为
k,h,value三列再处理。
内容的提问来源于stack exchange,提问作者Leo96
相关产品推荐
相关产品推荐

