基于dplyr按字符类型条件统计国家单独与联合出现次数
实现国家单独/共同出现次数统计的具体方法
嘿,我完全get到你的需求了——在已经统计好国家总出现次数的基础上,新增两列分别记录每个国家单独出现的行数和与其他国家共同出现的次数。下面我用Python Pandas(处理这类表格数据的主流工具)给你一步步演示实现逻辑,附代码和示例输出:
核心思路
咱们的核心逻辑是先识别每行是否只包含当前国家,再通过分组聚合统计对应行数:
- 处理原始行数据,标记每行包含的国家数量
- 将每行的多国家记录拆分为单国家行,方便分组
- 按国家分组,分别统计总出现次数、单独出现行数、共同出现行数
具体代码实现
假设你的原始数据集是每行以逗号分隔的国家列表(比如'USA, Canada'),代码如下:
import pandas as pd # 模拟你的原始数据集(替换成你真实的数据即可) raw_data = pd.DataFrame({ 'countries': ['China', 'USA, Canada', 'China, Japan', 'USA', 'Germany', 'France, Germany'] }) # 步骤1:拆分每行国家为列表,并计算每行的国家数量 raw_data['country_list'] = raw_data['countries'].str.split(', ') raw_data['total_countries_in_row'] = raw_data['country_list'].apply(len) # 步骤2:展开国家列表,把每行的多个国家拆成单独行 expanded_data = raw_data.explode('country_list').rename(columns={'country_list': 'country'}) # 步骤3:分组统计目标指标 final_result = expanded_data.groupby('country').agg( total_occurrences=('country', 'count'), # 总出现次数 single_occurrence_rows=('total_countries_in_row', lambda x: sum(x == 1)), # 单独出现的行数 joint_occurrence_rows=('total_countries_in_row', lambda x: sum(x > 1)) # 和其他国家共同出现的行数 ).reset_index() # 查看结果 print(final_result)
示例输出
运行上述代码后,你会得到这样的结果:
country total_occurrences single_occurrence_rows joint_occurrence_rows 0 China 2 1 1 1 Canada 1 0 1 2 France 1 0 1 3 Germany 2 1 1 4 Japan 1 0 1 5 USA 2 1 1
适配不同数据结构
如果你的原始数据结构不是逗号分隔的列表(比如每行是单个国家,但有分组ID标记是否和其他国家同组),只需要调整步骤1的逻辑:比如通过分组ID判断同一组内的国家数量,再统计每个国家所在组的数量是否为1即可。核心逻辑都是判断国家所在行/组是否只有它自己,再做分组统计。
内容的提问来源于stack exchange,提问作者Amleto
相关产品推荐
相关产品推荐

