如何在数据集中按行将每列除以其前一列(非硬编码实现)
按行计算列间比值(当前列除以前一列)
以下是不硬编码列名的实现方案,支持自动适配任意数量的数值列:
R 实现
高效矩阵操作法
假设你的数据集名为df,DATE为日期列,其余为数值列:
# 提取所有数值列 num_cols <- df[, !names(df) %in% "DATE"] # 计算当前列与前一列的比值,第一列填充NA ratio_cols <- cbind(NA, num_cols[, -1] / num_cols[, -ncol(num_cols)]) # 对齐列名并合并回日期列 colnames(ratio_cols) <- colnames(num_cols) result_df <- cbind(df["DATE"], ratio_cols)
tidyverse 行操作法
library(dplyr) result_df <- df %>% rowwise() %>% mutate(across(-DATE, ~ . / get(as.character(as.numeric(cur_column()) - 1)))) %>% ungroup() %>% mutate(across(matches("^0$"), ~ NA_real_))
Python Pandas 实现
假设你的数据集名为df:
import pandas as pd # 提取数值列(排除DATE列) num_cols = df.drop("DATE", axis=1) # 按行将当前列除以前一列,shift(axis=1)自动实现列左移补NaN ratio_cols = num_cols.div(num_cols.shift(axis=1), axis=0) # 合并回日期列 result_df = pd.concat([df["DATE"], ratio_cols], axis=1)
运行后示例数据的输出结果为:
DATE 0 1 2 07/01/2022 NaN 0.80 0.75 08/01/2022 NaN 0.75 0.67 09/01/2022 NaN 1.00 0.50
内容的提问来源于stack exchange,提问作者nwk123
相关产品推荐
相关产品推荐

