如何用for循环或简洁命令简化重复Pandas代码并合并结果
简化重复数据处理并合并结果
方法1:使用for循环遍历唯一值
这种方法直观易懂,适合逐步验证每个子集的处理逻辑:
import numpy as np import pandas as pd # 获取cal列的所有唯一值 unique_cal_values = df['cal'].unique() # 创建空列表存储每个子集的处理结果 result_list = [] for val in unique_cal_values: # 筛选当前cal值对应的子数据集(加.copy()避免SettingWithCopyWarning) subset = df[df['cal'] == val].copy() # 计算lesser_count:利用numpy的广播和三角矩阵实现逻辑 diff_matrix = np.subtract.outer(subset['col2'].values, subset['cal2'].values) lower_triangle = np.tril(diff_matrix, k=0) subset['lesser_count'] = np.sum(lower_triangle < 0, axis=1) # 过滤出lesser_count大于0的行 filtered = subset[subset['lesser_count'] > 0] # 将结果加入列表 result_list.append(filtered) # 合并所有子集结果为单个DataFrame final_combined_result = pd.concat(result_list, ignore_index=True)
方法2:使用groupby向量化处理(推荐)
利用pandas的groupby可以更简洁高效地完成分组处理,避免显式循环,更符合pandas的惯用写法:
import numpy as np import pandas as pd def process_cal_group(group): # 对每个分组执行相同的计算逻辑 diff_matrix = np.subtract.outer(group['col2'].values, group['cal2'].values) lower_triangle = np.tril(diff_matrix, k=0) group['lesser_count'] = np.sum(lower_triangle < 0, axis=1) # 返回过滤后的结果 return group[group['lesser_count'] > 0] # 按cal列分组,应用处理函数,最后合并结果 final_combined_result = df.groupby('cal').apply(process_cal_group).reset_index(drop=True)
补充说明
- 两种方法最终都会输出合并后的单个数据集,满足你的需求。
groupby方法在处理大数据集时性能更优,内部做了优化,减少了重复的DataFrame创建操作。- 如果运行时出现
SettingWithCopyWarning,可以在筛选子集时添加.copy()(如方法1中所示),确保操作的是数据副本而非视图。
内容的提问来源于stack exchange,提问作者hadi ahmadi
相关产品推荐
相关产品推荐

