分组内数值统计:如何按年份统计Guest/Stranger数量并标记年份类型
按年份统计Guest/Stranger数量并标记年份类型的实现方案
嘿,我来帮你搞定这个需求!咱们的目标很明确:按年份分组统计character字段为'Guest'和'Stranger'的记录数,然后根据数量对比给每个年份打上对应的标签。下面一步步来实现:
第一步:过滤目标数据并分组统计
首先,我们需要从数据集中筛选出character是Guest或Stranger的记录,然后按年份分组统计各自的数量。用pandas来做这个非常顺手:
import pandas as pd # 假设你的数据集存在titles变量里 # 先过滤出我们需要的character值 filtered_data = titles[titles['character'].isin(['Guest', 'Stranger'])] # 按年份(你示例里的n列,实际如果是year字段就替换)和character分组,统计数量 yearly_counts = filtered_data.groupby(['n', 'character']).size().unstack(fill_value=0)
这里unstack(fill_value=0)是为了把Guest和Stranger变成列,方便后续对比,缺失的数量用0填充。
第二步:给年份打标签
接下来我们要给每个年份判断标签,直接用apply函数写个简单的逻辑就行:
# 定义标签规则:Guest多就是guest year,否则是strange year yearly_counts['year_tag'] = yearly_counts.apply( lambda row: 'guest year' if row['Guest'] > row['Stranger'] else 'strange year', axis=1 ) # 要是想让年份从索引变回普通列,就重置索引 yearly_counts = yearly_counts.reset_index()
结合你的样例数据测试
你给出的样例数据里只有一条character是Guests(应该是笔误吧?假设是Guest),我模拟了一条Stranger的数据来测试,完整代码如下:
# 模拟你的样例数据(修正character并补充一条Stranger记录) sample_data = { 'name': ['Homo', 'Ramon', "'El Guisa'", "'El Viti'", 'Murray', 'TestUser'], 'type': ['actor']*6, 'character': ['Guest', 'Owner', 'Bailaor', 'Cantaor', 'Himself', 'Stranger'], 'n': [22.0, None, 25.0, 20.0, None, 22.0] } titles = pd.DataFrame(sample_data) # 执行上述逻辑 filtered_data = titles[titles['character'].isin(['Guest', 'Stranger'])] yearly_counts = filtered_data.groupby(['n', 'character']).size().unstack(fill_value=0) yearly_counts['year_tag'] = yearly_counts.apply( lambda row: 'guest year' if row['Guest'] > row['Stranger'] else 'strange year', axis=1 ) yearly_counts = yearly_counts.reset_index() print(yearly_counts)
运行后输出:
n Guest Stranger year_tag 0 22.0 1 1 strange year
如果两者数量相等,这里默认标记为strange year,你可以自己加个判断分支处理平局的情况,比如改成:
lambda row: 'guest year' if row['Guest'] > row['Stranger'] else ('strange year' if row['Stranger'] > row['Guest'] else 'tie year')
一些需要注意的细节
- 如果你实际的年份字段不是
n,记得把代码里的'n'替换成真实的字段名(比如'year') - 如果
character字段有拼写不一致的情况(比如guests、Guest),先做清洗:titles['character'] = titles['character'].str.strip().str.title() - 要是有缺失的年份值,可以提前过滤掉:
filtered_data = filtered_data.dropna(subset=['n'])
内容的提问来源于stack exchange,提问作者Tony Z.
相关产品推荐
相关产品推荐

