如何在Pandas DataFrame中按索引分组生成状态与国家组合分类?
Pandas按索引分组实现Nation/Status组合分类
1. 先明确你的分类规则
先把需要的Nation/Status Mix分类逻辑理清楚,比如假设你要的五类是(可根据实际需求修改):
- 国内活跃:Nation为'CN'且Status='Active'
- 国内非活跃:Nation为'CN'且Status='Inactive'
- 海外活跃:Nation≠'CN'且Status='Active'
- 海外非活跃:Nation≠'CN'且Status='Inactive'
- 混合类型:同一Single Client Index下存在多种Nation/Status组合
2. 准备示例数据(和你的结构一致)
先模拟一个数据集方便演示,你可以直接替换成自己的DataFrame:
import pandas as pd data = { 'Single Client Index': ['A001', 'A001', 'A002', 'A003', 'A003', 'A004'], 'Nation': ['CN', 'CN', 'US', 'CN', 'US', 'JP'], 'Status': ['Active', 'Active', 'Inactive', 'Active', 'Active', 'Inactive'], 'Client Name': ['张三', '张三', 'John', '李四', '李四', 'Yamada'] } df = pd.DataFrame(data)
3. 核心:自定义分组分类函数
写一个函数,对每个分组判断属于哪种分类:
def get_mix_category(group): # 提取当前分组所有不重复的Nation+Status组合 unique_pairs = group[['Nation', 'Status']].drop_duplicates().values.tolist() # 先判断是否是混合类型(多种组合) if len(unique_pairs) > 1: return '混合类型' # 单一组合的情况,匹配分类 nation, status = unique_pairs[0] if nation == 'CN': return '国内活跃' if status == 'Active' else '国内非活跃' else: return '海外活跃' if status == 'Active' else '海外非活跃' # 按Single Client Index分组,应用分类函数 category_result = df.groupby('Single Client Index').apply(get_mix_category).reset_index(name='Nation/Status Mix')
4. 合并分类结果到原数据(可选)
如果需要把分类和原数据绑定,用merge:
final_df = pd.merge(df, category_result, on='Single Client Index')
5. 查看最终结果
运行print(final_df)会输出:
Single Client Index Nation Status Client Name Nation/Status Mix 0 A001 CN Active 张三 国内活跃 1 A001 CN Active 张三 国内活跃 2 A002 US Inactive John 海外非活跃 3 A003 CN Active 李四 混合类型 4 A003 US Active 李四 混合类型 5 A004 JP Inactive Yamada 海外非活跃
注意事项
- 你可以完全修改
get_mix_category里的逻辑,比如调整国家代码、状态值,或者新增更多分类 drop_duplicates()是关键,避免同一分组内重复的记录干扰判断- 如果你的DataFrame很大,
groupby.apply效率足够应付大部分场景,若要优化可以用transform结合逻辑判断,但初学者用apply更直观
内容的提问来源于stack exchange,提问作者BenKen10
相关产品推荐
相关产品推荐

