如何用Python或R自动拆分表格列并生成统计1数量的新表
Python 实现方案
核心逻辑:按列名中___分割出前缀(新表名)和后缀(新表列名),对每个前缀分组,统计原列中1的出现次数并构建新表。
import pandas as pd # 筛选所有包含"___"的目标列 target_cols = [col for col in df.columns if '___' in col] # 用字典存储生成的新表 result_tables = {} for col in target_cols: # 仅分割一次,避免前缀中的下划线被拆分 prefix, suffix = col.split('___', 1) # 初始化新表(如果不存在) if prefix not in result_tables: result_tables[prefix] = pd.DataFrame(index=df.index) # 统计当前列中每行1的出现次数:兼容单个值或列表/元组格式 def count_ones(x): if isinstance(x, (list, tuple)): return x.count(1) return 1 if x == 1 else 0 result_tables[prefix][suffix] = df[col].apply(count_ones)
使用时直接通过字典键调用新表,比如result_tables['survey_answer_1']就是拆分后的目标表格。
R 实现方案
用tidyverse工具链处理,更适配数据框的分组与格式转换:
library(tidyverse) # 筛选目标列 target_cols <- df %>% select(contains("___")) %>% colnames() # 转换为长格式并拆分列名 long_df <- df %>% select(all_of(target_cols)) %>% pivot_longer(everything(), names_to = "col_name", values_to = "value") %>% separate(col_name, into = c("prefix", "suffix"), sep = "___", extra = "merge") # 统计1的次数并拆分出各个新表 result_tables <- long_df %>% mutate( count_1 = case_when( is.list(value) ~ sapply(value, \(x) sum(x == 1)), value == 1 ~ 1, TRUE ~ 0 ) ) %>% pivot_wider(names_from = suffix, values_from = count_1) %>% group_split(prefix, .keep = FALSE) %>% set_names(unique(long_df$prefix))
生成的result_tables是命名列表,比如result_tables[["survey_answer_1"]]对应拆分后的表格。
你之前踩坑的可能原因
- 使用
split('___')未限制分割次数:如果前缀本身包含下划线(比如survey_answer_1),会被拆成多个片段,导致前缀识别错误,必须用split('___', 1)(Python)或separate(..., extra = "merge")(R)确保仅拆分一次。 - 字典初始化或列赋值逻辑错误:比如没有保留原数据的索引,或者未正确处理不同数据类型的1的统计(比如列表中的1)。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

