在数据处理中,经常需要基于某一列的值(索引列)从其他列中选择对应的值来创建新的列。这是在数据框操作中非常常见的需求,特别是在Pandas(Python)、R的data.frame或SQL等数据处理工具中。
import pandas as pd
# 示例数据框
df = pd.DataFrame({
'index_col': ['A', 'B', 'C', 'A', 'B'],
'col1': [10, 20, 30, 40, 50],
'col2': [100, 200, 300, 400, 500],
'col3': [1000, 2000, 3000, 4000, 5000]
})
# 方法1: 使用apply和lambda函数
df['new_col'] = df.apply(lambda row: row[f'col{row["index_col"]}'] if f'col{row["index_col"]}' in df.columns else None, axis=1)
# 方法2: 使用lookup方法(适用于Pandas旧版本)
# df['new_col'] = df.lookup(df.index, 'col' + df['index_col'])
# 方法3: 使用numpy的choose函数
import numpy as np
mapping = {'A': 1, 'B': 2, 'C': 3}
df['new_col'] = np.choose([mapping[x] for x in df['index_col']], [df['col1'], df['col2'], df['col3']])
print(df)
# 示例数据框
df <- data.frame(
index_col = c('A', 'B', 'C', 'A', 'B'),
col1 = c(10, 20, 30, 40, 50),
col2 = c(100, 200, 300, 400, 500),
col3 = c(1000, 2000, 3000, 4000, 5000)
)
# 方法1: 使用apply
df$new_col <- apply(df, 1, function(row) {
col_name <- paste0("col", which(LETTERS == row["index_col"]))
if (col_name %in% names(df)) {
return(row[col_name])
} else {
return(NA)
}
})
# 方法2: 使用dplyr
library(dplyr)
df <- df %>%
mutate(new_col = case_when(
index_col == 'A' ~ col1,
index_col == 'B' ~ col2,
index_col == 'C' ~ col3,
TRUE ~ NA_real_
))
print(df)
-- 假设有一个表table1
SELECT
index_col,
col1,
col2,
col3,
CASE
WHEN index_col = 'A' THEN col1
WHEN index_col = 'B' THEN col2
WHEN index_col = 'C' THEN col3
ELSE NULL
END AS new_col
FROM table1;
get()
方法或case_when
语句numpy
的choose
函数try-except
块捕获异常apply
和lambda
,优先考虑向量化操作numpy.where
或numpy.select
进行条件选择eval()
方法可以加速某些操作这种方法在数据预处理、特征工程和数据分析中非常有用,能够灵活地根据条件从不同列中提取数据创建新特征。