You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:35:18