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

Python实现月份转年后的条件计数并生成统计DataFrame的代码优化咨询

解决月份转年份并按阈值统计数量的问题

首先,咱们先捋一下你现有代码里的几个核心问题:

  1. 语法错误:两个for循环结尾都缺少冒号:,这会直接导致代码运行报错;
  2. 逻辑偏差:你把所有符合value > i的数值都塞进了data列表,但最后没法区分这些数值对应哪个i阈值;
  3. Lambda写法错误:Lambda表达式里不能直接写if x > i,正确的三元表达式格式是lambda x: 1 if x > i else 0,但就算修正了这个,你的逻辑也没法得到每个i对应的独立计数。

高效的实现思路

其实不用嵌套循环或者Lambda绕弯,用Pandas的向量操作就能简洁高效地完成需求,步骤如下:

  1. 批量转换月份到年份:把月份转成年份的操作只需要做一次,不用放到循环里,既高效又清晰;
  2. 按阈值逐个统计:对每个i,直接统计年份列中大于i的元素个数;
  3. 构造目标DataFrame:把每个阈值的描述和计数整理成字典列表,再转成你想要的表格格式。

完整代码示例

import pandas as pd

# 假设你的df已经存在,先添加年份列(只计算一次)
df['years'] = round(df['month'] / 12, 1)

# 存储每个阈值的统计结果
result_list = []

# 遍历每个阈值i(4到7,左闭右开,所以range(4,8))
for i in range(4, 8):
    # 统计大于i的年份数量:布尔数组的sum就是True的个数
    count = (df['years'] > i).sum()
    # 将当前阈值的描述和计数加入结果列表
    result_list.append({
        'Description': f'> {i} years',
        'Count': count
    })

# 转成目标格式的DataFrame
result_df = pd.DataFrame(result_list)
print(result_df)

代码细节解释

  • df['years'] = round(df['month'] / 12, 1):一次性把所有月份转成保留1位小数的年份,避免重复计算,提升代码效率;
  • (df['years'] > i).sum():Pandas会自动把布尔数组(每个元素是True/False)转换为1/0,sum之后就是符合条件的元素数量,比手动循环统计快得多;
  • 字典列表转DataFrame:每个字典对应表格的一行,最后用pd.DataFrame直接转换,完美匹配你想要的输出格式。

如果你坚持要用Lambda(不推荐,效率较低)

如果一定要用Lambda实现计数,需要调整逻辑为每个i单独统计:

# 先把年份列转成列表
data = round(df['month'] / 12, 1).tolist()
counts = []

for i in range(4, 8):
    # 用map+Lambda统计当前i对应的符合条件的数量
    count = sum(map(lambda x: 1 if x > i else 0, data))
    counts.append({'Description': f'> {i} years', 'Count': count})

# 转成DataFrame
result_df = pd.DataFrame(counts)

但这种方法需要把Series转成列表,手动循环统计,数据量大的时候性能远不如Pandas的向量操作。

内容的提问来源于stack exchange,提问作者JoMcGee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:22:37