Python实现月份转年后的条件计数并生成统计DataFrame的代码优化咨询
解决月份转年份并按阈值统计数量的问题
首先,咱们先捋一下你现有代码里的几个核心问题:
- 语法错误:两个
for循环结尾都缺少冒号:,这会直接导致代码运行报错; - 逻辑偏差:你把所有符合
value > i的数值都塞进了data列表,但最后没法区分这些数值对应哪个i阈值; - Lambda写法错误:Lambda表达式里不能直接写
if x > i,正确的三元表达式格式是lambda x: 1 if x > i else 0,但就算修正了这个,你的逻辑也没法得到每个i对应的独立计数。
高效的实现思路
其实不用嵌套循环或者Lambda绕弯,用Pandas的向量操作就能简洁高效地完成需求,步骤如下:
- 批量转换月份到年份:把月份转成年份的操作只需要做一次,不用放到循环里,既高效又清晰;
- 按阈值逐个统计:对每个
i,直接统计年份列中大于i的元素个数; - 构造目标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
相关产品推荐
相关产品推荐

