R语言:基于dataframe中位数行新增计算列的方法
实现思路与可运行代码
不需要纠结“先复制列再修改”还是“直接新增列”,两种方式结果完全一致,核心卡点是如何精准拿到每列对应的中位数做除数,避免列值和除数错配。
分步操作
- 提取中位数行的对应数值
你的DataFrame用国家名、Medians作为行索引,直接通过索引标签取出中位数行即可,取出的结果会和原DataFrame的列一一对应,做除法时自动按列匹配,不会出现GDP列错用人均值当除数的问题:# 取出每列对应的中位数,返回结果是和列名严格对齐的Series medians = df1.loc["Medians"] - 批量生成带
_1后缀的计算列
直接逐列计算原值和对应中位数的商,赋值给新列就行,没必要提前复制原列——提前复制反而会多占一份内存,完全多余:# 遍历需要处理的原列,生成对应的新列 for ori_col in ["GDP", "per_capita"]: df1[f"{ori_col}_1"] = df1[ori_col] / medians[ori_col] # 要是需要整数结果,加一行类型转换即可 df1[f"{ori_col}_1"] = df1[f"{ori_col}_1"].astype(int)
结果验证
运行完代码后得到的DataFrame和你预期的最终效果完全一致:
GDP per_capita GDP_1 per_capita_1 France 2 3 1 1 Spain 2 3 1 1 Ethiopia 4 9 2 3 Medians 2 3 1 1
实操注意点
- 取中位数的时候优先用索引标签
loc['Medians'],别用按位置取最后一行的iloc[-1],如果后续数据行顺序调整,按位置取数很容易错配 - 中间类似
2/2的字符串形式不需要刻意存储,那只是计算过程的示意,最终直接存数值结果即可 - 后续要是新增更多带数值的列,只要把列名加入遍历的列表,就能自动生成对应的归一化列,不用重复写除法逻辑
内容的提问来源于stack exchange,提问作者Jusep
相关产品推荐
相关产品推荐

