使用Pandas按party_b分组统计不同usage_type出现次数的实现方法
实现步骤
1. 数据预处理
首先导入pandas库,从原始嵌套数据中提取_source层的有效字段构造DataFrame:
import pandas as pd # 原始数据集 raw_data = [{ '_score': 1.220763, '_source': {'response_id': '8801756091550_1633620760', 'usage_type': 'SMSMT', 'party_b': '8801810107222', 'party_a': '8801756091550', 'additionalProperties': {}, 'event_time': '20211007093240'}}, {'_score': 1.220763, '_source': {'response_id': '8801756091550_1633625609', 'usage_type': 'MOC', 'party_b': '8801736636044', 'party_a': '8801756091550', 'partya_original': None, 'additionalProperties': {}, 'event_time': '20211007105329'}}, {'_score': 1.220763, '_source': {'response_id': '8801756091550_1633625851', 'usage_type': 'MOC', 'party_b': '8801777701826', 'party_a': '8801756091550', 'partya_original': None, 'additionalProperties': {}, 'event_time': '20211007105731'}}, {'_score': 1.220763, '_source': {'response_id': '8801756091550_1633626326', 'usage_type': 'SMSMO', 'party_b': '8801736636044', 'party_a': '8801756091550', 'partya_original': None, 'additionalProperties': {}, 'event_time': '20211007110526'}}] # 提取有效数据生成DataFrame df = pd.DataFrame([item['_source'] for item in raw_data])
2. 分组统计指定类型的出现次数
两种常用实现方法,均支持自动补全无记录的类型统计值为0:
方法1:groupby + value_counts 实现
# 按party_b分组统计各usage_type出现次数,转成宽表格式 result = df.groupby('party_b')['usage_type'].value_counts().unstack(fill_value=0) # 仅保留需要统计的三个类型,过滤其他无关类型 result = result.reindex(columns=['SMSMT', 'MOC', 'SMSMO'], fill_value=0)
方法2:crosstab 交叉表实现
# 直接生成交叉表并过滤指定列 result = pd.crosstab(df['party_b'], df['usage_type']).reindex(columns=['SMSMT', 'MOC', 'SMSMO'], fill_value=0)
输出结果
两种方法得到的结果格式一致:
| party_b | SMSMT | MOC | SMSMO |
|---|---|---|---|
| 8801736636044 | 0 | 1 | 1 |
| 8801777701826 | 0 | 1 | 0 |
| 8801810107222 | 1 | 0 | 0 |
如果需要把索引列party_b转为普通列,执行result = result.reset_index()即可。
内容的提问来源于stack exchange,提问作者Md.Shams Araf Shovon
相关产品推荐
相关产品推荐

