Python中基于目标值获取温度列的最大共现数值方法
嘿,我明白你的需求了——你有一个带多列温度数据和一列目标值的DataFrame,想针对每个目标值找出温度列里出现次数最多的数值(或者出现次数大于1的),但用crosstab会返回所有组合,太冗余了对吧?尤其是你数据量还很大(数千行+30列温度),得找高效的方法。我来给你几个实用的解决方案:
先准备模拟数据(方便你测试)
首先我们构造一个和你场景匹配的示例DataFrame,你可以直接替换成自己的真实数据:
import pandas as pd import numpy as np # 设置随机种子保证结果可复现 np.random.seed(42) # 定义温度列名称(你实际有30列的话,这里可以扩展) temp_cols = [f'temp{i}' for i in range(1, 4)] # 生成模拟数据 df = pd.DataFrame({ **{col: np.random.randint(10, 30, 100) for col in temp_cols}, 'target': np.random.choice(['A', 'B', 'C'], 100) })
场景1:按目标值分组,获取每个目标对应的高频温度值
这个方法会针对每个目标值,把该组下所有温度列的数值合并后统计频次,筛选出你需要的结果:
def get_target_top_temps(group, min_occurrence=1): # 把当前目标组的所有温度值摊平成一维数组(高效处理多列) all_temps = group[temp_cols].values.flatten() # 统计每个温度值的出现次数 temp_count = pd.Series(all_temps).value_counts() # 筛选出符合出现次数要求的结果 filtered = temp_count[temp_count >= min_occurrence] if filtered.empty: return None # 两种返回方式选一种: return filtered.index[0] # 返回出现次数最多的单个温度值 # return filtered.index.tolist() # 返回所有出现次数>=min_occurrence的温度值列表 # 按target分组应用函数,这里设置min_occurrence=2,即只保留出现次数>1的 result = df.groupby('target').apply(get_target_top_temps, min_occurrence=2) print(result)
场景2:针对单个特定目标值,获取高频温度值
如果你只需要关注某个特定的目标值(比如目标值为'A'),可以直接筛选后处理,效率更高:
target_value = 'A' min_occurrence = 2 # 筛选目标值为A的行,提取所有温度列并摊平 target_temps = df[df['target'] == target_value][temp_cols].values.flatten() # 统计频次 temp_count = pd.Series(target_temps).value_counts() # 获取结果 top_temp = temp_count.index[0] # 出现次数最多的温度值 filtered_temps = temp_count[temp_count >= min_occurrence].index.tolist() # 所有符合次数要求的温度值 print(f"目标值[{target_value}]的最高频温度值:{top_temp}") print(f"目标值[{target_value}]出现次数≥{min_occurrence}的温度值:{filtered_temps}")
大数据集优化建议
因为你有数千行+30列温度数据,推荐用collections.Counter来替代pandas的value_counts(),在处理大规模数据时速度会更快:
from collections import Counter def get_top_temps_fast(group, min_occurrence=1): all_temps = group[temp_cols].values.flatten() # 用Counter统计频次 temp_counter = Counter(all_temps) # 按出现次数降序排序 sorted_temps = sorted(temp_counter.items(), key=lambda x: x[1], reverse=True) # 筛选符合要求的结果 filtered = [temp for temp, cnt in sorted_temps if cnt >= min_occurrence] return filtered[0] if filtered else None # 分组应用高效版函数 result_fast = df.groupby('target').apply(get_top_temps_fast, min_occurrence=2)
这个方法避免了pandas的一些额外开销,处理大数据集时会更顺畅。
内容的提问来源于stack exchange,提问作者Nandan Lahurikar
相关产品推荐
相关产品推荐

