基于现有列中位数为DataFrame新增2534列的实现求助
解决方案
首先,我们需要处理除PATID外的所有列,为每一列生成对应的_med列:数值≤该列中位数标记为low,否则标记为high。以下是两种适合新手的实现方式:
方法1:循环处理(逻辑直观)
这种方式步骤清晰,容易理解,适合新手逐步跟进:
# 遍历所有需要处理的列(排除PATID) for col in df.columns.drop('PATID'): # 计算当前列的中位数 med_value = df[col].median() # 生成对应的_med列并赋值 df[f'{col}_med'] = df[col].apply(lambda x: 'low' if x <= med_value else 'high') # 调整列顺序:把_med列放在原列的下一个位置 col_position = df.columns.get_loc(col) df.insert(col_position + 1, f'{col}_med', df.pop(f'{col}_med'))
方法2:批量处理(高效快捷)
如果面对2534列的大数据量,这种向量化操作的速度更快:
import pandas as pd # 提取所有需要处理的基因列 gene_columns = df.columns.drop('PATID') # 计算每列的中位数 column_medians = df[gene_columns].median() # 批量生成所有_med列的结果 med_results = df[gene_columns].le(column_medians).replace({True: 'low', False: 'high'}) # 给结果列添加_med后缀 med_results.columns = [f'{col}_med' for col in gene_columns] # 构造新的列顺序:原列与对应_med列交替排列 new_column_order = [] for col in gene_columns: new_column_order.append(col) new_column_order.append(f'{col}_med') # 合并原数据与结果,调整列顺序 df = pd.concat([df, med_results], axis=1)[['PATID'] + new_column_order]
处理后的数据示例
最终生成的DataFrame结构如下:
| PATID | Gene1 | Gene1_med | Gene2 | Gene2_med | Gene3 | Gene3_med |
|---|---|---|---|---|---|---|
| 1001 | 5.899 | low | 67.87 | high | 9.87 | high |
| 1002 | 6.899 | low | 60.87 | low | 10.87 | high |
| 1003 | 7.899 | high | 63.87 | low | 8.87 | low |
注意事项
- 如果数据中存在缺失值,
median()方法会自动忽略;若需要处理缺失值,可先使用df.fillna()填充后再执行上述代码。
内容的提问来源于stack exchange,提问作者Arthi Rajendran
相关产品推荐
相关产品推荐

