如何用Pandas最优比较两数据集分类值频率并存储结果?
如何将分类变量的value_counts结果存入DataFrame用于后续对比
当然可以,你可以修改现有函数,让它同时收集每个分类变量的频率统计结果,存储为结构化的DataFrame(或字典映射的DataFrame集合),方便后续的对比和统计检验。以下是具体实现方案:
改进后的函数:同时生成可视化和存储频率数据
这个函数会遍历指定的分类列,计算每个列的计数和占比,将结果存入字典(键为列名,值为对应频率DataFrame),同时保留原有的饼图生成功能:
import pandas as pd import matplotlib.pyplot as plt def process_categorical_data(data, dataset_name, cat_columns): # 初始化字典,存储每个分类列的频率结果 frequency_results = {} for column in cat_columns: # 计算计数和占比(dropna=False保留缺失值的统计) count_series = data[column].value_counts(dropna=False) proportion_series = data[column].value_counts(dropna=False, normalize=True) # 合并为带列名的DataFrame freq_df = pd.DataFrame({ 'count': count_series, 'proportion': proportion_series.round(4) # 保留4位小数,方便查看 }) # 设置索引名称,明确分类取值的含义 freq_df.index.name = f"{column}_category" frequency_results[column] = freq_df # 生成饼图(保留原有可视化逻辑) plt.figure() count_series.plot(kind='pie', autopct='%1.1f%%') plt.title(f"Distribution of {column} Patients in {dataset_name}") plt.ylabel('') return frequency_results
使用方式
分别处理两个数据集,得到各自的频率结果字典:
# 处理第一个数据集 dataset1_freq = process_categorical_data(df1, "Dataset 1", cat_columns) # 处理第二个数据集 dataset2_freq = process_categorical_data(df2, "Dataset 2", cat_columns)
访问和操作频率数据
- 查看单个列的频率统计:
# 查看Dataset 1中gender列的计数和占比 print(dataset1_freq['gender'])
- 合并所有列的结果为统一DataFrame(方便批量对比):
如果需要把所有分类列的统计结果合并成一个大表,可以用以下辅助函数:
def combine_frequency_results(freq_dict): combined_list = [] for col_name, freq_df in freq_dict.items(): temp_df = freq_df.reset_index() temp_df['original_column'] = col_name combined_list.append(temp_df) return pd.concat(combined_list, ignore_index=True) # 合并两个数据集的频率结果 dataset1_combined = combine_frequency_results(dataset1_freq) dataset2_combined = combine_frequency_results(dataset2_freq)
后续统计显著性对比示例
以卡方检验为例,对比两个数据集某一分类列的分布差异:
from scipy.stats import chi2_contingency # 选取要对比的列,比如"gender" col_to_compare = "gender" # 获取两个数据集的计数,并对齐所有分类取值(避免某数据集缺失部分分类) counts1 = dataset1_freq[col_to_compare]['count'] counts2 = dataset2_freq[col_to_compare]['count'] all_categories = counts1.index.union(counts2.index) counts1_aligned = counts1.reindex(all_categories, fill_value=0) counts2_aligned = counts2.reindex(all_categories, fill_value=0) # 构建列联表 contingency_table = pd.DataFrame({ "Dataset 1": counts1_aligned, "Dataset 2": counts2_aligned }) # 执行卡方检验 chi2_stat, p_value, dof, expected = chi2_contingency(contingency_table) print(f"Chi-square statistic: {chi2_stat:.2f}") print(f"P-value: {p_value:.4f}")
这样处理后,所有频率数据都以结构化的形式存储,方便你随时访问、筛选和进行后续的统计分析。
内容的提问来源于stack exchange,提问作者jroskam2
相关产品推荐
相关产品推荐

